"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 未知并防止潜在的错误未连接情况(例如,如果以其他方式托管)。
我有一个 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 未知并防止潜在的错误未连接情况(例如,如果以其他方式托管)。