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

时间:2011-01-26 03:29:29

标签: c# httpwebrequest fiddler

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

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();

10 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:7)

获取后关闭HttpWebResponse

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

这是同步代码的伪:

request.create(url);

///codes

httpwebresponse response = (httpwebresponse)request.getresponse();

/// codes again like reading it to a stream

response.close();

答案 2 :(得分:5)

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

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

IWebProxy proxy = request.Proxy;

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

答案 3 :(得分:3)

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

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

<configuration>
  <system.net>
    <defaultProxy>
      <proxy scriptLocation="http://example.com:81/proxy.script" />
    </defaultProxy>
  </system.net>
</configuration>

答案 4 :(得分:2)

我几周前就遇到过类似的问题了,原因是当fiddler正在运行时它改变代理设置以通过Fiddler传递请求但是当它关​​闭时代理仍然保留,因此不允许你的请求继续上网。

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

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

答案 5 :(得分:2)

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

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

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

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

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

答案 6 :(得分:1)

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

Fiddler keeps a pool of open connections,但在没有fiddler的情况下运行时,您的C#test或powershell脚本

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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

将以下条目添加到webconfig文件

<system.net>
<connectionManagement>
<add address="*" maxconnection="30"/>

  

答案 9 :(得分:0)

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

ServicePointManager.DefaultConnectionLimit = 10000;