在执行约定操作期间调用回调



我正在Azure上编程WCF服务。

在我的服务中,我需要在执行约定操作期间调用回调。当我尝试这样做时,将抛出一个异常,并且客户端将被锁定。我认为这是由于通道是为合约操作而打开的,在当前通道中调用回调会锁定线程,对吗?我想得到这个场景的解决方案。

这是超时异常消息:

此请求操作发送到网tcp://127.255.0.0:8000/MytestWCFService没有收到回复在配置的超时内(00:00:59.9889989)。分配的时间到该操作可能已经是较长超时的一部分。这可能是因为服务仍在处理操作,或者因为该服务无法发送回复消息。请考虑增加操作超时(通过强制通道/代理到IContextChannel并设置OperationTimeout属性),并确保该服务能够连接到客户

编辑:代码示例

[ServiceContract(Namespace="testnamespace")]   
public interface ICallback   
{   
    [OperationContract(IsOneWay=true)]   
    void Callbackmethod();   
}  

然后我在服务端实现IContract:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,   
    ConcurrencyMode=ConcurrencyMode.Reentrant,   
    AddressFilterMode=AddressFilterMode.Any)]   
public class WCFService : IContract   
{      
   public int Add(int a, int b)   
   {   
       int result = a + b;  
       ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();   
       callback.Callbackmethod();   
       return result;   
   }   
}   

我在当前频道回拨,这是一个双工频道。

如果操作和回调是两种方式,那么很可能会出现死锁问题。用以下属性标记您的服务类别:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyServiceContract { ... }

编辑:

另外,在您的WPF应用程序中,将其添加到回调实现的实现中:

[CallbackBehavior(UseSynchronizationContext = false)]

最新更新