WPF Webbrowser在多次打开时使用多个会话

时间:2011-11-30 19:24:23

标签: wpf browser

我们在其中一个详细信息窗口上有一个WPF webbrowser。当用户点击搜索结果时,详细信息窗口将打开,因此可以并且将会嵌入此Web浏览器打开多个详细信息窗口。 URL指向需要许可证的Java应用程序,并配置了NTLM以对用户进行身份验证。

第一个打开的窗口很好,但是如果你打开更多,那么java app会给出一个错误,即使用了所有许可证。在IE中一切都很好,你可以打开这个java应用程序的多个窗口,然后继续工作。

我可以在webbrowser上配置一些只使用一个会话然后在关闭主窗口时清除所有内容的东西吗?

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

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

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

我可以发布代码,但我不知道这有什么用,因为它只是简单的xaml插入控件,并将源值设置为网页。

2 个答案:

答案 0 :(得分:0)

有没有办法可以将每个窗口/浏览会话分成不同的应用程序域?

http://msdn.microsoft.com/en-us/library/system.appdomain.aspx

退出窗口时,您可能会丢弃该appdomain以及其中使用的资源。

答案 1 :(得分: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); 
        }
        ...
}