2011-01-26 18 views
20

这可能是我遇到的最奇怪的问题。我有一段代码将POST提交给一个url。代码不起作用,当fiddler没有运行时不会引发任何异常,但是,当fiddler运行时,代码将成功发布数据。我有权访问帖子页面,以便知道数据是否已发布。这可能是非常不合理的,但这是我遇到的情况,我很困惑。HttpWebRequest不工作​​,除非当提琴手正在运行

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

是请求得到偶然重定向和小提琴手正在处理呢? – BrokenGlass 2011-01-26 03:38:44

+0

如果有任何重定向我会在提琴手的日志中看到它吗? – deadlock 2011-01-26 03:42:52

+0

`postBytes`可能包含应该被url编码的字符吗?也许提琴手默默地为你过滤? – 2011-01-26 03:52:50

回答

14

如果你不叫GetResponseStream()那么你就不能关闭响应。如果你没有关闭响应,那么你最终将在.NET处于坏状态的套接字。您必须关闭回应以防止干扰您稍后的请求。

2

好吧,我都面临着类似的问题,几个星期前,其原因是,当小提琴手正在运行,改变了代理设置通过小提琴手,但是当它关​​闭了代理不知何故仍然将请求传递,因此不会允许您的请求在互联网上继续。

我试图通过设置IE和Firefox的网络设置,以不采取任何代理和它的工作。

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

5

我最近有类似的问题。 Wireshark会显示HTTPWebRequest不会离开客户机,除非Fiddler正在运行。我尝试删除代理设置,但这并没有解决我的问题。我尝试了一切,从设置请求到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

对我来说,当我有同样的情况(当小提琴手正在运行POST只适用)的代码背后的代理到外部服务器开发环境上IISExpress运行的应用程序在发送POST。显然,即使您在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> 
7

得到它后关闭HttpWebResponse

我有同样的问题,然后我开始关闭每个请求后的响应,并且Boom,不需要有提琴手运行。

这是一个同步码伪:

request.create(url); 

///codes 

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

/// codes again like reading it to a stream 

response.close(); 
2

我遇到了同样的问题与Python - 请求到本地服务器与404进行了失败,但后来当我使用Fiddler运行他们跑他们工作正常。

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

在我在,我正在请求到本地服务器的确切情况,定期流量通过代理和Local Area Network (LAN) Settings用于网络连接的Proxy server窗格中的Bypass proxy server for local addresses选项被选中。

我的怀疑是“本地地址的绕过代理服务器”不一定被编程语言拿走,但代理服务器的详细信息是。 Fiddler意识到这一政策,所以通过Fiddler的请求工作,但直接从编程语言请求不。

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

1

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

Fiddler keeps a pool of open connections,但您的C#测试或PowerShell脚本没有时,它运行没有提琴手。

因此,您可以通过在HttpWebRequest上将属性UnsafeAuthenticatedConnectionSharing设置为true来使测试/脚本也维护一个开放的已验证连接池。阅读more about it here, microsoft KB。在这篇文章中的两种情况下,您都可以看到他们正在制作两个请求。第一个是获取身份验证头的简单GET或HEAD(完成握手),第二个是POST,它将使用之前获取的头。

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

1

我们在这里有一个非常类似的问题。我们连接到远程服务,他们似乎几乎总是失败。然而,当我们通过fiddler(从web服务器)进行代理时,一切都非常出色。我们正在努力调试,但是,这听起来像是一个非常类似的问题。

0

始终使用使用构造。它确保呼叫

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

添加以下条目毕竟资源释放到webconfig文件

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

相关问题