asD*_*a21 4 .net c# header http winforms
我正在使用 C# 和 .NET 3.5。如您所知,我们可以Navigate()在 Web 浏览器控件上添加自定义标题,如下所示:
var myUrl = "http://example.com/mypage.htm";
System.Uri uri = new Uri(myUrl);
byte[] authData = System.Text.UnicodeEncoding.UTF8.GetBytes("user:password");
string authHeader =
"Authorization: Basic " + Convert.ToBase64String(authData) + "\r\n" +
"User-Agent: MyUserAgent\r\n";
webTDW8961nd.Navigate(uri, "", null, authHeader);
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我们为单个导航设置了基本授权标头。
现在让我们谈谈重定向。如果我们要执行将重定向到另一个页面的 javascript,则不会包含基本授权标头。
你的解决方案是什么?如何添加适用于所有请求而不仅仅是一次的标头?
问题是,虽然 WinForm 和 WPFWebBrowser只是 ActiveX IE 控件的一个相对较薄的包装器,但它们并没有公开我们感兴趣的所有事件(第二个提供的甚至比第一个还少)。有两种方法可以解决这个问题:第一,子类化 WF 浏览器控件并添加您需要的内容或使用 WPF 并在那里添加钩子。我发现第二种方法在 WPF 应用程序中更方便。
您只需要相关的接口。最简单的方法是添加对Microsoft Internet Controls的引用(您会在 COM 标题下找到它是 VS)。这会打开一个名为的命名空间SHDocVw,其中包含我们需要的所有内容(如果出于任何原因,您想摆脱这种依赖关系,您可以简单地将使用的 P/Invoke 接口复制到您自己的代码中)。
您可以使用反射获取底层浏览器。null如果你太早调用它,它会返回,所以我把它放到WebBrowser.Navigating处理程序中:
using SHDocVw;
var ActiveXInstance = (IWebBrowser2)Browser.GetType().InvokeMember("ActiveXInstance", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, Browser, new object[] { });
Run Code Online (Sandbox Code Playgroud)
一旦你拥有它,你就可以用浏览器做一些好事。例如,您可以使用未直接公开的各种属性和方法:
ActiveXInstance.Silent = true; // suppresses script error dialogs
Run Code Online (Sandbox Code Playgroud)
并添加缺少的事件挂钩:
var SetupEvents2 = (DWebBrowserEvents2_Event)ActiveXInstance;
SetupEvents2.BeforeNavigate2 += OnBeforeNavigate2;
Run Code Online (Sandbox Code Playgroud)
有两个事件接口,2变体包含较新的事件。你可以在MSDN上查看所有这些。
而且,回到标题:该BeforeNavigate2事件允许您将额外的标题放入提供的对象中:
private void OnBeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel) {
Headers = $"Accept-Language: XX;en\r\n";
}
Run Code Online (Sandbox Code Playgroud)