除非fiddler正在运行,否则HttpWebRequest不起作用

这可能是我遇到过的最棘手的问题。 我有一段代码将POST提交到url。 当fiddler没有运行时,代码不起作用也不会抛出任何exception。但是,当fiddler运行时,代码会成功发布数据。 我可以访问post页面,所以我知道数据是否已被POSTED。 这可能是非常无意义的,但这是我遇到的情况,我很困惑。

byte[] postBytes = new ASCIIEncoding().GetBytes(postData); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://myURL); req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10"; req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3"); req.Headers.Add("Accept-Language", "en-US,en;q=0.8"); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = postBytes.Length; req.CookieContainer = cc; Stream s = req.GetRequestStream(); s.Write(postBytes, 0, postBytes.Length); s.Close(); 

如果您不调用GetResponseStream()则无法关闭响应。 如果不关闭响应,那么最终会在.NET中处于错误状态的套接字。 您必须关闭响应以防止干扰您以后的请求。

获取后关闭HttpWebResponse

我有同样的问题,然后我开始在每个请求后关闭响应,而Boom,不需要让fiddler运行。

这是同步代码的伪:

 request.create(url); ///codes httpwebresponse response = (httpwebresponse)request.getresponse(); /// codes again like reading it to a stream response.close(); 

我最近遇到了类似的问题。 除非Fiddler正在运行,否则Wireshark会显示HTTPWebRequest不会离开客户端计算机。 我尝试删除代理设置,但这并没有解决我的问题。 我尝试了从设置请求到HttpVersion.Version10,启用/禁用SendChuck,KeepAlive以及许多其他设置的所有内容。 这些都没有奏效。

最后,我刚检查.Net是否检测到了代理并且请求尝试忽略它。 这解决了我的问题request.GetResponse()抛出一个立即exception。

 IWebProxy proxy = request.Proxy; if (request.Proxy != null) { Console.WriteLine("Removing proxy: {0}", proxy.GetProxy(request.RequestUri)); request.Proxy = null; } 

在我的情况下,当我遇到相同的情况时(POST仅在Fiddler运行时有效),代码将POST从运行在IISExpress上的应用程序发送到代理后面的开发环境中的外部服务器。 显然,即使您在Internet选项中配置了代理设置,IIS运行的环境也可能无权访问它们。 在我的工作环境中,我只需要使用代理配置脚本的路径更新web.config。 您可能需要调整其他代理设置 。 在这种情况下,您的朋友是这个MSDN页面,解释它们是什么: http : //msdn.microsoft.com/en-us/library/sa91de1e.aspx 。

最后,我在应用程序的web.config中包含以下内容,然后POST经历了。

        

好吧,几个星期前我遇到了类似的问题,原因是当fiddler运行时它更改代理设置以通过Fiddler传递请求但是当它关​​闭时代理仍然保留,因此不允许您的请求继续互联网。

我尝试将IE和Firefox的网络设置设置为不接受任何代理,并且它有效。

试试这个,可能是同样的问题……

我遇到了与Python相同的问题 – 对本地服务器的请求失败了404,但是当我用Fiddler运行它们时它们运行正常。

这里问题的真正线索是Fiddler通过充当HTTP流量的代理来工作,以便来自本地机器的所有请求都通过Fiddler而不是直接进入网络。

在我所处的确切情况下,我向本地服务器发出请求,常规流量通过代理和Local Area Network (LAN) Settings进行网络连接Proxy server窗格选中“ Bypass proxy server for local addresses选项。

我怀疑是“本地地址的绕过代理服务器”不一定是编程语言,而是代理服务器的详细信息。 Fiddler知道这个政策,所以通过Fiddler工作请求但是直接来自编程语言的请求却没有。

通过将本地服务器请求的代理设置为空,它可以从代码中正常工作。 显然,如果您发现自己在部署期间从内部服务器迁移到外部服务器,那么这可能是一个难题。

我遇到了同样的情况:我正在POST到Windows身份validation后面的端点。

Fiddler保留了一个开放连接池 ,但是当它没有fiddler运行时,你的C#test或powershell脚本就不会

因此,您可以通过在HttpWebRequest UnsafeAuthenticatedConnectionSharing属性UnsafeAuthenticatedConnectionSharing设置为true来使测试/脚本也维护一组打开的经过身份validation的连接。 在这里阅读更多相关信息,microsoft KB 。 在该文章的两个案例中,您都可以看到他们正在发出两个请求。 第一个是获取身份validation标头的简单GET或HEAD(完成握手),第二个是POST,它将使用之前获得的标头。

显然你不能 (悲伤)直接与POST http请求握手。

我们在这里有一个非常相似的问题。 我们正在连接远程服务,它们似乎几乎总是失败。 但是,当我们通过fiddler(来自网络服务器)进行代理时,一切都运行得非常好。 我们正在努力调试,但是,听起来这是一个非常类似的问题。

始终使用构造。 它确保所有资源在通话后释放

  using (HttpWebResponse responseClaimLines = (HttpWebResponse)requestClaimLines.GetResponse()) { using (StreamReader reader = new StreamReader(responseClaimLines.GetResponseStream())) { responseEnvelop = reader.ReadToEnd(); } } 

将以下条目添加到webconfig文件中

    

我找到了增加默认连接数的解决方案

 ServicePointManager.DefaultConnectionLimit = 10000;