我正在高负载下测试 ASP.NET (.NET 4) Web 应用程序,发现在某些情况下HttpWebRequest.BeginGetResponse()
同步完成而不会引发任何异常。
在高负载下在多个 ASP.NET 线程中运行以下代码后,我发现“WEBREQUEST COMPLETED SYNC!” 日志中的消息。
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
var result = webRequest.BeginGetResponse(internalCallback, userState);
if (result.CompletedSynchronously)
{
Trace.Error("WEBREQUEST COMPLETED SYNC!");
}
请注意:
- 如果达到线程池容量,则抛出 InvalidOperationException
- 如果连接过程中发生错误,则抛出相应的异常
就我而言,没有例外!
我对 System.Net 程序集进行了反编译,发现在某些条件下确实可行。但我不明白这些条件是什么意思(System.Net.Connection.SubmitRequest(HttpWebRequest request, bool forcedsubmit)
):
if (this.m_Free && this.m_WriteDone && !forcedsubmit && (this.m_WriteList.Count == 0 || request.Pipelined && !request.HasEntityBody && (this.m_CanPipeline && this.m_Pipelining) && !this.m_IsPipelinePaused))
{
this.m_Free = false;
needReConnect = this.StartRequest(request, true);
if (needReConnect == TriState.Unspecified)
{
flag = true;
this.PrepareCloseConnectionSocket(ref returnResult);
this.Close(0);
}
}
何时以及为什么这可能?