取消客户端中止的WCF操作

时间:2011-06-17 18:54:00

标签: c# .net wcf

我有一个silverlight客户端,可以在我的WCF Web服务上调用方法来从数据库中获取值。在长查询的情况下,我想给用户提供取消它的选项。

客户端,当用户按“取消”时,我在我的WCF实例上调用“.Abort()”。但是,我的WCF服务仍将继续运行,因为它不知道客户端已不再连接。

我的问题是:WCF服务是否有可能知道客户端已经终止连接?

我曾试图在我的合约方法中使用Channel.Closed / faulted事件,但是他们从不开火......

[AspNetCompatibilityRequirements(RequirementsMode =  AspNetCompatibilityRequirementsMode.Allowed)]
internal class MyContract: IMyContract
{
    public object QueryDatabase(...)
    {
        System.ServiceModel.OperationContext.Current.Channel.Faulted += new System.EventHandler(Channel_Faulted);
        System.ServiceModel.OperationContext.Current.Channel.Closed += new System.EventHandler(Channel_Faulted);

        // Perform sql query
    }

    void Channel_Faulted(object sender, System.EventArgs e)
    {
        // Cancel SQL query here
    }
}

任何人都知道如何做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:2)

Faulted和Closed事件确实可以按照您在代码示例中使用它们的方式使用,但仅当您使用的绑定支持可靠会话时,并且您启用了可靠的会话。检查您使用的绑定是否支持它,如果支持,则启用它。

<bindings>
  <netTcpBinding>
    <binding>
      <reliableSession ordered="true"
            inactivityTimeout="0:10:0"
            enabled="true" />
    </binding>
  </netTcpBinding>
</bindings>

如果你的绑定不支持这个,那么你可以考虑切换到那个。 You can find a list of what is supported for the different bindings here.

答案 1 :(得分:0)

客户端需要向服务发送另一个请求,让它知道它需要取消 - 这假定

  1. 该服务可以识别为此取消客户端执行的工作
  2. 正在执行的工作实际上是可取消的(许多异步操作都没有取消API