C# 在客户端中止时取消WCF操作

C# 在客户端中止时取消WCF操作,c#,.net,wcf,C#,.net,Wcf,我有一个silverlight客户端,它可以调用我的WCF web服务上的一个方法来从数据库中获取值。在长查询的情况下,我想给用户取消它的选项 客户端,当用户按“取消”时,我在我的WCF实例上调用.Abort()。但是,我的WCF服务仍将继续运行,因为它不知道客户端已不再连接 我的问题是:WCF服务是否可能知道客户端已终止连接 我已尝试在合同方法中引用Channel.Closed/faulted事件,但它们从未触发 [AspNetCompatibilityRequirements(Require

我有一个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
    }
}
有人知道怎么做吗?
谢谢

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

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

  • 故障事件和关闭事件确实可以按照您在代码示例中使用它们的方式使用,但是只有在您使用的绑定支持可靠会话并且您启用了可靠会话时才可以使用。请检查您使用的绑定是否支持它,如果支持,请启用它

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

    如果你的绑定不支持这个,那么你可以考虑切换到一个。


    我目前正在使用BasicHttpBinding。我查看了您发布的文章,发现它不支持可靠的会话。我必须进一步调查是否可以使用其他类型的绑定(如WSHttpBinding),因为BasicHttpBinding最初用于更好的互操作性。。。