Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WinForms WebBrowser在重定向时重置标题_.net_Winforms_Header - Fatal编程技术网

.net WinForms WebBrowser在重定向时重置标题

.net WinForms WebBrowser在重定向时重置标题,.net,winforms,header,.net,Winforms,Header,内部Web服务器要求我提供自定义http头以访问网页。这在大多数情况下都很好,但是如果html或javascript启动重定向或使用AJAX请求,它就不再使用我的标题 是否有办法更改此行为,使其始终发送我的自定义标题 private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate("http://localhost/test.php", null, null, "User-Age

内部Web服务器要求我提供自定义http头以访问网页。这在大多数情况下都很好,但是如果html或javascript启动重定向或使用AJAX请求,它就不再使用我的标题

是否有办法更改此行为,使其始终发送我的自定义标题

    private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.Navigate("http://localhost/test.php", null, null, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\r\nSomething-Custom: TestValue");
    }
php文件中的Javascript代码:

<script>
window.location="?redirect";
</script>

window.location=“?重定向”;

第一个请求收到了我的标题“Something Custom”,而第二个带有?redirect的请求没有收到。我还添加了用户代理来验证它是否确实重置了所有的头。

有几种可能的方法可以做到这一点。研究领域非常广阔

覆盖每个导航的标题

钩住
Navigating
事件,取消它,并使用所需的标题调用
Navigate
(不要取消此事件:)

你甚至可以

在导航前更改标题

如果您不喜欢取消请求,然后重新发出请求,那么您可以尝试钩住
导航
事件并更新标题

问题是:IWebBrower2控件本身提供了头作为的参数。但是在.NET代码中,对于客户端代码,
WebBrowserNavigatingEventArgs
中不会显示标题

可能的解决方案是创建自己版本的WebBrowserEvent,子类WebBrowser控件,重写CreateSink方法以连接您版本的WebBrowserEvent。此版本应正确处理标题

因此,您可以在导航之前更改标题

调整Javascript端——有点模糊

您可以通过
WebBrowser.ObjectForScripting
property将浏览器应用程序与客户端连接-它可作为
window.external
用于Javascript对象

您可以钩住链接单击事件,或者构建自己的方法来通知外部对象导航需求

然后,您将能够从.NET端执行所有导航,并根据需要指定标题

系统代理


设置本地代理(您可以使用Fiddler进行实验)。你可以做任何你想要的标题操作。WebBrowser控件将使用IE配置中的代理的唯一问题。

回答得好!!有很多方法。我的问题是通过使用您的第一个解决方案解决的,取消每个导航事件并使用我自己的标题调用它们。小提示如果您只想更改用户代理或设置代理,请详细说明“导航前更改标题”的内容?我已经重写了CreateSink,我想给每个签名导航添加一个标题。@Simone-这类似于自定义类“WebBrowser2EventThelper”可以在BeforeNavigate方法中接收标题(本示例中未实现)在这里,您可以在传递到web浏览器之前对其进行更改。@mikalai-您的意思是在导航之前更改事件本身中的标题,还是在导航中处理导航,并使用正确的标题启动新的导航调用Navigate?从我的测试来看,第一个没有效果,第二个产生了iFrame的问题。。。但也许我做错了。谢谢。@Simone是的,第一种方式看起来更一致。