这可能是我遇到的最棘手的问题。我有一段代码将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();
答案 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;