我正在開發一個C#應用程序,它從Web服務器記錄數據。它將以下發布的請求發送到網絡服務器並等待響應。httpWebRequest(底層連接已關閉:連接意外關閉。)
/// <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"
我試圖調試錯誤,我已經爲了從給定的Firefox檢查POST請求使用小提琴手。令我驚訝的是,每當菲德勒是我的程序完美工作。當我關閉小提琴手時,我有同樣的錯誤。
我懷疑由於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捕獲數據時工作。 繼@EricLaw建議我看着延遲:
而且它可能在
WebResponse response = request.GetResponse();
更新中值得注意的是,該計劃產生的誤差。 我發現這篇文章 HttpWebRequest gets slower when adding an Interval 哪些建議轉動的Nagle算法。 現在沒有關閉的連接,雖然總體響應有一個小滯後(當我使用winforms,而不是異步)。
我已經安裝了Wireshark,並且已經確認標題是相同的。 :-( – NMech