Kei*_*ith 10 asp.net iis performance
我有一个长期运行的ASP响应(实际上是一个MVC动作),如果用户已经导航,我想取消它.我认为这应该很简单:
if(!this.Response.IsClientConnected)
{
Response.End();
}
Run Code Online (Sandbox Code Playgroud)
所以我运行自己的测试(使用MVC迷你探查器,虽然你可以使用自己的):
using (var step = MiniProfiler.Current.Step("Response_IsClientConnected"))
if(!this.Response.IsClientConnected)
{
Response.End();
}
Run Code Online (Sandbox Code Playgroud)
结果发现每次我调用它都会非常快:我的开发人员设置不到1毫秒.这是真是假.
在什么情况下Response.IsClientConnected预计会很慢?
我必须支持IIS6 - 会Response.IsClientConnected更慢吗?
有谁知道它在幕后做了什么?在低级别,我希望TCP/IP堆栈知道连接是否仍然存在,所以我希望这个检查是即时的,但IIS是否还需要做一些额外的工作来检查?
Mar*_*n B 11
好问题但遗憾的是没有答案,但可以提供以下信息.希望这可以成为了解它在幕后做什么的起点.
在Response.IsClientConnected被询问当前工作人员检查该HttpWorkerRequest处理请求.
工作者请求可以是以下类型之一,并由ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP)其调用ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType).这是从低级ISAPI到ASP.NET运行时的入口点.
对于所有InProc HttpWorkerRequest工作程序,然后通过调用将该调用定向回非扩展控制块(ECB)int EcbIsClientConnected(IntPtr pECB)中的非托管代码webengine.dll pECB,提供对ISAPI请求的所有低级访问.此引用最初传递给ISAPIRuntime.ProcessRequest.
现在我找不到该EcbIsClientConnected方法的任何实现细节.因此,如果没有这个,就不可能知道它在幕后做了什么,以及对于不同版本的IIS,这可能有何不同.也许其他人可以解释这个?我也想知道.
| 归档时间: |
|
| 查看次数: |
1816 次 |
| 最近记录: |