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