"cooperatively" 终止 WCF 服务的方法(基本 HTTP,非双工)

Method of "cooperatively" terminating a WCF service (basic HTTP, non-duplex)

我有一个 WCF 服务需要 时间才能 运行。 (为了这个问题,我对中断服务调用不感兴趣。)

但是,当客户端强行断开连接时,WCF 服务将继续 运行 完成 - 即使客户端永远不会收到响应。

我找到了有关可靠消息传递(此处似乎不适用)、双工 channels/behaviors(我不想实施或要求)的信息,并了解如何 "break up" 服务请求。

但是,我想知道是否可能没有像后台工作人员的 CancellationPending 属性 这样的 "simple" 方法,那么该服务将看起来像这样:

while (!WCFRequest.CancellationPending && !FinishedWithLongOperation) {
   DoOnePartOfTheLongOperation();
}

如果没有,有什么办法可以添加吗?或者甚至用严重的异常(即 TheadInterruptedException)踢 WCF 线程?

服务本身被设计成完全幂等的 wrt 完成的工作和报告。


WCF 服务托管在 IIS 7 中,我怀疑这可能是相关的。

对于 托管在 IIS 中作为 HTTP/HTTPS 端点的 WCF 服务,我使用的是 HttpResponse.IsClientConnected,它在这里工作 (TM)。

注意:这取决于托管服务器(例如 IIS)正确检测断开连接的能力。通常,这些必须有序断开。 YMMV.

代码在功能上等同于:

while (!FinishedWithLongOperation) {
    if (Connection.ClientConnectedStatus == ClientStatus.Disconnected) {
       throw new Exception("Client definitely disconnected!");
    }
    DoOnePartOfTheLongOperation();
}

备注:

  • "Connection" 是通过依赖注入注入的(因此理论上可以更改为其他堆栈)和 ..
  • .. ClientConnectedStatus return 是 {Connected, Disconnected, Unknown} 之一;仅当客户端 "definitely disconnected" 时才会发生中止,因此 ..
  • .. 如果没有 IIS / HTTPContext,则 ClientConnectedStatus 将始终 return 未知并防止潜在的错误未连接情况(例如,如果以其他方式托管)。