我正在开发一个使用C#编写的应用程序,它可以记录来自Web服务器的数据。它发送以下POST请求到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;
}
我遇到了错误
> "The underlying connection was closed: The connection was closed
> unexpectedly"
我已经尝试调试错误,并使用Fiddler检查Firefox发送的POST请求。令我惊讶的是,每当使用Fiddler时,我的程序都能很好地运行。但是当我关闭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而不是async时)。