NMe*_*ech 13 c# httpwebrequest fiddler connectionexception
我正在开发一个C#应用程序,它从Web服务器记录数据.它将以下发布请求发送到Web服务器并等待响应.
/// <summary>
/// Function for obtaining testCgi data
/// </summary>
/// <param name="Parameters"></param>
/// <returns></returns>
private string HttpmyPost(string Parameters)
{
string str = "No response";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriTestCGI);
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(Parameters);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
try
{
var result = reader.ReadToEnd();
stream.Dispose();
str = result.ToString();
reader.Dispose();
}
catch (WebException ex)
{
//System.Windows.Forms.MessageBox.Show(ex.Message);
System.Diagnostics.Trace.WriteLine(ex.Message);
}
finally
{
request.Abort();
}
return str;
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
> "The underlying connection was closed: The connection was closed
> unexpectedly"
Run Code Online (Sandbox Code Playgroud)
我试图调试错误,并且我使用了fiddler来检查Firefox提供的post请求.令我惊讶的是,只要Fiddler在我的节目中工作得非常好.当我关闭提琴手时,我遇到了同样的错误.
我怀疑,由于Fiddler充当代理,它可能会改变一些设置.我尝试过使用webclient,结果是一样的.
当我尝试在python中编写请求时,一切正常,但没有任何问题.对于cource,我可以选择安装IronPython并包装该特定功能,但是我认为这有点过分且缺乏优雅,所以我正在追求更精简的方法.我怀疑这只不过是一个设置调整.
我试过修改,在我的情况下,它是无关紧要的.
request.Accept
request.ReadWriteTimeout
request.Timeout
request.UserAgent
request.Headers
request.AutomaticDecompression
request.Referer
request.AllowAutoRedirect
//request.TransferEncoding
request.Expect
request.ServicePoint.Expect100Continue
request.PreAuthenticate
request.KeepAlive
request.ProtocolVersion
request.ContentType
Run Code Online (Sandbox Code Playgroud)
无论是否进行上述调整,代码在Fiddler捕获数据时都能正常工作.
另外值得注意的是程序产生错误
WebResponse response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
更新:根据@EricLaw的建议,我调查了Latency.我发现这篇文章 HttpWebRequest在添加一个 建议转向Nagle算法的Interval时会变慢.现在没有关闭的连接,虽然整体响应有一个小的延迟(当我使用winforms,而不是async时).
Eri*_*Law 28
我写了一些关于Fiddler如何"神奇地"修复问题的方法:http://blogs.telerik.com/fiddler/posts/13-02-28/help!-running-fiddler-fixes-my-app-
您遇到的问题实际上是.NET Framework本身的一个错误.HTTP的规则使得服务器可以在发送第一响应之后随时关闭KeepAlive连接(例如,即使客户端请求KeepAlive行为,它也不需要接受连接上的另一个请求).
.NET有一个错误,它希望服务器Connection: close在响应完成后关闭连接时将包含响应头.如果服务器关闭没有Connection: Close标头的连接(根据RFC2616完全有效),.NET在尝试发送连接上的下一个请求时将遇到关闭的连接,并且它将抛出此异常..NET 应该做的是以静默方式创建新连接并在该新连接上重新发送请求.
Fiddler解决了这个问题,因为它不关心服务器是否关闭连接,并且它保持与客户端的连接活动.当客户端发送第二个请求时,Fiddler会尝试重用其与服务器的连接,注意到它已关闭,并以静默方式创建新连接.
您可以通过以下方式缓解代码中的此问题:
方法#3仅在您控制服务器时有效,并且因为客户端可能位于使用后关闭连接的网关/代理后面,所以您应该使用方法#2.