我正在开发一个 C# 应用程序,它记录来自网络服务器的数据。它将以下发布请求发送到网络服务器并等待响应。
/// <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;
}
我收到错误
> "The underlying connection was closed: The connection was closed
> unexpectedly"
我试图调试错误,并且我使用 fiddler 来检查 Firefox 给出的发布请求。令我惊讶的是,每当 Fiddler 是我的程序时,我的程序运行良好。当我关闭提琴手时,我遇到了同样的错误。
我怀疑由于 Fiddler 充当代理,它可能会更改某些设置。我试过使用 webclient,结果是一样的。
当我尝试在 python 中编写请求时,一切正常,没有问题。当然,我可以选择安装 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
无论是否进行上述调整,代码在 Fiddler 捕获数据时都有效。
同样值得注意的是,该程序在
WebResponse response = request.GetResponse();
更新:按照@EricLaw 的建议,我调查了延迟。我发现这篇文章 HttpWebRequest 在添加 建议打开 Nagle 算法的间隔时变慢。现在没有关闭的连接,尽管整体响应有一点滞后(当我使用 winforms,而不是异步时)。