【发布时间】:2024-06-21 15:00:01
【问题描述】:
我正在开发一个从网络服务器记录数据的 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 gets slower when adding an Interval 这建议转向 Nagle 算法。 现在没有关闭连接,尽管整体响应有一点延迟(当我使用 winforms,而不是异步时)。
【问题讨论】:
标签: c# httpwebrequest fiddler connectionexception