2016-06-15 6 views
1

Anforderung: Zwei eingebettete .Net-WebBrowser-Steuerelemente, die jeweils eine andere IE-Sitzung verwenden. Serverseite legt die Sitzung des Benutzers fest. Dies wird gespeichert und über mehrere WebBrowser-Steuerelemente (genau wie Registerkarten) freigegebenSo erzwingen Sie das .Net-WebBrowser-Steuerelement zum Starten einer neuen Sitzung/eines neuen Prozesses

Die Art, wie dies in Standard-IE behandelt wird, ist durch Auswählen von Datei> Neue Sitzung. Dies öffnet ein neues IE-Fenster in einem anderen Prozess, daher teilen sie nicht die gleiche Sitzung im Speicher

Das einzige, was ich tun konnte, ist die erste WebBrowser-Sitzung zu beenden und daher eine neue zu starten im zweiten Webbrowser. Allerdings bedeutet dies, ich die erste Sitzung zu verlieren, die die Anforderung mir sagt, ich soll nicht

die Browser-Sitzung beendet in folgenden Weise durchgeführt wird

[DllImport("wininet.dll", SetLastError = true)] 
    private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); 

    private const int INTERNET_OPTION_END_BROWSER_SESSION = 42; 

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0); 

Hat jemand eine Idee, wie WebBrowser-Steuerelemente kann jeweils isoliert werden in einer anderen Sitzung/Prozess?

Antwort

0

Dies ist nicht möglich mit der aktuellen Art und Weise WebBrowser funktioniert. Sie teilen eine Sitzung für alle Instanzen von WebBrowser.

Ich weiß nicht, ob es ein anderes Webbrowser-Steuerelement gibt, das mehrere aktive Verbindungen unterstützt (mindestens CefSharp doesn't), aber ich würde empfehlen, eine Lösung auf diese Weise zu finden.

+0

Ich suche derzeit mit Awesomium. Sieht so aus, als könnten WebSessions einzeln zwischengespeichert werden, hoffentlich werde ich es bald herausfinden. – JAnton

+0

Okay. Viel Glück. –

0

BEARBEITEN: Ich habe mich hier geantwortet. Awesomium ist in der Lage dies zu tun, aber nicht IE

Wie bereits erwähnt, kann dies nicht mit aktuellen .Net WebBrowser getan werden. Ich konnte dies mit Awesomium erreichen. Wenn Sie ihre .NET-Beispiele herunterladen und den Browser mit Registerkarten ändern, können Sie dies testen, indem Sie ein neues WebControl und eine neue WebSession hinzufügen, die damit verknüpft ist. Nur ein neues DataPath Verzeichnis für die neue Sitzung bilden (dh .Cache2)

In meinem Beispiel bearbeitete ich folgendes:

Added ein neues Websession in TabView.xaml:

<awe:WebSessionProvider 
    x:Key="GlobalSession2" 
    x:Shared="False" 
    DataPath=".\Cache2" 
    Preferences="{x:Static local:MainWindow.WebPreferences}"/> 

Modified die Zeilen eine neue Zeile hinzuzufügen:

<Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="300"/> 
          <RowDefinition Height="300"/> 
         </Grid.RowDefinitions> 

hat ein neues WebControl (und sorrounding Grenzen usw.) direkt nach dem Ende des sorroundings ersten WebControl. Dies nutzt die neue Session zuvor hinzugefügt:

<Grid x:Name="browserContainer2" Grid.Row="2"> 
          <Border 
           x:Name="browserBorder2" 
           BorderThickness="0,1,0,0" 
           BorderBrush="{DynamicResource ControlBorderBrush}" 
           Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"> 
           <awe:WebControl 
            x:Name="PART_Browser2" 
            Source="{Binding Source2, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
            NativeView="{Binding NativeView, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
            IsSourceView="{TemplateBinding IsSourceView}" 
            IsEnabled="{TemplateBinding IsSelected}" 
            WebSession="{Binding Source={StaticResource GlobalSession}}" /> 
          </Border> 
          <ui:MetroProgressBar 
           Grid.ZIndex="100" 
           VerticalAlignment="Top" 
           HorizontalAlignment="Stretch" 
           Margin="0,3" 
           IsIndeterminate="{Binding IsNavigating, ElementName=PART_Browser}" 
           Visibility="{Binding IsNavigating, ElementName=PART_Browser, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
          <Grid 
           x:Name="statusGrid2" 
           Height="25" 
           VerticalAlignment="Bottom" 
           Opacity="0.8"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <Border 
            x:Name="statusBox2" 
            Background="{DynamicResource ControlBackgroundBrush}" 
            BorderBrush="{DynamicResource ControlBorderBrush}" 
            BorderThickness="0,1,1,0" 
            CornerRadius="0,5,0,0" 
            IsHitTestVisible="False"> 
            <TextBlock 
             x:Name="targetURLBlock2" 
             VerticalAlignment="Center" 
             Margin="5,0" 
             IsHitTestVisible="False" 
             Focusable="False" 
             Text="{Binding TargetURL, ElementName=PART_Browser, Converter={StaticResource UrlConverter}}" 
             TextTrimming="CharacterEllipsis"/> 
           </Border> 
           <Grid 
            x:Name="zoomBox2" 
            Grid.Column="1" 
            Margin="5,0,0,0"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto" /> 
             <ColumnDefinition Width="Auto" /> 
            </Grid.ColumnDefinitions> 
            <Border 
             Grid.ZIndex="-100" 
             Grid.ColumnSpan="2" 
             Background="{DynamicResource ControlBackgroundBrush}" 
             BorderBrush="{DynamicResource ControlBorderBrush}" 
             BorderThickness="1,1,0,0" 
             CornerRadius="5,0,0,0" 
             IsHitTestVisible="False"/> 
            <TextBlock 
             VerticalAlignment="Center" 
             Margin="7,0" 
             Text="Zoom:"/> 
            <Slider 
             x:Name="zoomBar2" 
             Grid.Column="1" 
             DataContext="{Binding ElementName=PART_Browser}" 
             Style="{StaticResource FlatSlider}" 
             Margin="0,0,25,0" 
             Minimum="10" 
             Maximum="400" 
             Width="120" 
             VerticalAlignment="Center" 
             Value="{Binding Zoom}" 
             AutoToolTipPlacement="TopLeft" 
             IsSnapToTickEnabled="True" 
             IsMoveToPointEnabled="True" 
             SmallChange="1" 
             LargeChange="10" 
             TickFrequency="10" 
             Focusable="False"> 
             <Slider.ContextMenu> 
              <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
               <MenuItem Command="{x:Static awe:WebControlCommands.ResetZoom}" CommandTarget="{Binding}" /> 
              </ContextMenu> 
             </Slider.ContextMenu> 
            </Slider> 
           </Grid> 
          </Grid> 
         </Grid> 

Dann habe ich eine neue Source-Eigenschaft in TabView.cs hinzugefügt, um den zweiten Browser-URL zu speichern:

public Uri Source2 
    { 
     get { return this.GetValue(SourceProperty2) as Uri; } 
     set { SetValue(SourceProperty2, value); } 
    } 
public static readonly DependencyProperty SourceProperty2 = 
     DependencyProperty.Register("Source2", 
     typeof(Uri), typeof(TabView), 
     new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

Und schließlich fest einprogrammiert zwei URLs die beiden eingebetteten zu starten Browser

internal TabView(MainWindow parent, Uri url, bool isSourceView) 
    { 
     parentWindow = parent; 
     this.IsSourceView = isSourceView; 
     this.Source = new Uri("http://www.google.com"); 
     this.Source2 = new Uri("http://www.google.com"); 
    } 
Verwandte Themen