asp.net – 什么时候Response.IsClientConnected慢?

我有一个长时间运行的ASP响应(实际上是一个MVC动作),如果用户已经导航,我想取消.我认为这应该是相当简单的:
if(!this.Response.IsClientConnected)
{
    Response.End();
}

不过我从that this method is slow开始就碰到了various sources.

所以我运行自己的测试(使用MVC mini profiler,虽然你可以使用自己的):

using (var step = MiniProfiler.Current.Step("Response_IsClientConnected"))
if(!this.Response.IsClientConnected)
{
    Response.End();
}

这发现,每次我称之为它一直非常快:在我的开发人员设置的1ms以下.这是真的还是假的?

Response.IsClientConnected在什么情况下预计会很慢?

我必须支持IIS6 – Response.IsClientConnected会慢吗?

有谁知道在封面下做了什么?在低级别,我期望TCP / IP协议栈知道连接是否仍然存在,所以我希望这个检查是即时的,但IIS是否需要做一些额外的工作来检查?

解决方法

好的问题,但不幸的是没有答案,但可以提供以下信息.希望这可以是一个开始,知道在封面下做了什么.

Response.IsClientConnected正在通过询问当前工作人员HttpWorkerRequest处理请求来检查此问题.

工作者请求可以是以下类型之一,并且由ISAPIIRRuntime.ProcessRequest(IntPtr ecb,int iWRType)调用的ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb,bool uSEOOP)创建.这是从低级别ISAPI到ASP.NET运行时的入口点.

> ISAPIWorkerRequestInProcForIIS6
> ISAPIWorkerRequestInProcForIIS7> = IIS7
> ISAPIWorkerRequestInProc< IIS6
> ISAPIWorkerRequestOutOfProc对于proc请求

对于所有的InProc HttpWorkerRequest工作人员,此调用将通过调用位于作为扩展控制块(ECB)的webengine.dll pECB中的EcbIsClientConnected(IntPtr pECB)引回到非托管代码,提供对ISAPI的所有低级访问请求.该引用最初传递给ISAPIRuntime.ProcessRequest.

现在我找不到EcbIsClientConnected方法的任何实现细节.所以没有这个,这是不可能知道它在封面下做了什么,这可能不同于IIS的不同版本.也许别人可以解释一下我也想知道.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....