2011-11-30 28 views
1

我们有一个WPF webbrowser在我们的一个细节窗口。当用户单击搜索结果时,详细信息窗口会打开,因此可以嵌入此浏览器并打开多个详细信息窗口。该URL指向一个基于Java的应用程序,该应用程序需要许可证并配置有NTLM以对用户进行身份验证。WPF Webbrowser使用多个会话时打开不止一次

第一个打开的窗口很好,但是如果你打开更多的Java应用程序会给出所有许可证都被使用的错误。在IE中一切都很好,你可以打开这个Java应用程序的多个窗口,并消除。

有什么我可以在网页浏览器上配置只使用一个会话,然后在关闭主窗口时清除所有内容?

**编辑:来自供应商的Java应用程序注意到,当浏览器连接JBoss服务器时,会创建一个JSessionID,并且来自该计算机的每个其他连接都应该使用相同的JSessionID甚至不同的浏览器。 WPF控件正在做其他事情,因为它为每个打开的视图创建一个会话。

**编辑:我放的初始细节是不正确的。包含浏览器控件的视图是一个UserControl而不是一个窗口。

**编辑:如果我没有会话并启动IE/firefox等来打开Java应用程序,我可以获得许可证并使用该应用程序。现在我有一个会话,如果我尝试使用WebBrowser控件,它会尝试创建一个新的会话,我会得到有关许可证的错误。如果我关闭视图和浏览器窗口并尝试再次连接,我会再次提示许可证错误,就好像浏览器控件不知何故释放该会话一样。

我可以发布代码,但我没有看到它将如何帮助,因为它只是一个简单的xaml插入控件,其源值设置为网页。

回答

0

您可以尝试手动处理初始连接,然后使用NavigateToString来显示结果。事情是这样的:

String responseString; 

HttpWebRequest request = build you request, incorporate session token, etc 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) { 
    responseString = sr.ReadToEnd(); 
} 
browser.NavigateToString(responseString); 

编辑:

使用Cookie,source

public partial class WebBrowserControl : Form 
{ 
     private String url; 

     [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); 

     public WebBrowserControl(String path) 
     { 
      this.url = path; 
      InitializeComponent(); 

      // set cookie 
      InternetSetCookie(url, "JSESSIONID", Globals.ThisDocument.sessionID); 

      // navigate 
      webBrowser.Navigate(url); 
     } 
     ... 
} 
+0

我会尝试这个明天让你知道...谢谢 –

+1

我如何从会话令牌IE或其他浏览器。这是问题。我确信代码工作正常,它从IE,firefox或甚至chrome获得JSessionID,如果它已经打开并连接到JBoss。此外,如果我使用WPF浏览器打开JBoss,我该如何将该会话cookie再次发回给其他浏览器。 –

+0

如果您打开IE并打开Firefox,会发生什么?两个浏览器中的连接是否同时工作?您无法在浏览器之间共享Cookie或会话。 – tenorsax