WCF:从客户端回调处理程序调用自托管服务

时间:2012-04-25 18:42:22

标签: wcf concurrency

问题: 在WCF客户端中获取死锁异常消息。

场景:

  1. 服务调用客户端回调(此调用完全独立,由服务器上的某些条件启动)。

  2. 在客户端回调函数中,客户端调用服务中的函数,并且在抛出死锁异常时:

  3. 此操作将死锁,因为在当前消息完成处理之前无法接收回复。如果要允许无序消息处理,请在CallbackBehaviorAttribute上指定Reentrant或Multiple的ConcurrencyMode。

    我试图尽可能地简化代码。我读过这篇文章,但仍然无法找到问题所在:http://msdn.microsoft.com/en-us/library/cc294424.aspx 我很感激任何建议......

    SERVICE:

        [ServiceContract(Namespace = "http://abc.com/Core", SessionMode = SessionMode.Required, CallbackContract = typeof(ISvcCallback))] 
    public interface ISvc
    {
        // One way only - does not wait until operation completes and returns
        // Can initiate session
        [OperationContract(IsOneWay = true)]
        void Initialize(string appId);
    
        [OperationContract(IsInitiating = false)]
        Account GetCurrentAccount();
    

    }

    public interface ISvcCallback
    {
        /// <summary>
        /// Report status of the account
        /// </summary>
        /// <param name="acct"></param>
        [OperationContract(IsOneWay=true)]
        void AccountStatus(Account acct);
    

    }

    Service Implementation
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
    public class Svc : ISvc
    {
        public Account GetCurrentAccount()
        {
                SipAccount sipAcct = null;
                try
                {
                    Account acct = m_MyBusinessObject.GetCurrentAccount();
                }
                catch (Exception ex)
                {
    
                }
    
                return Acct;
            }
        }
    

    }

    客户端:

    public class CallbackHandler : WcfSipItfService.IWinSipItfCallback
    {
        public void AccountStatus(Account Acct)
        {          
                try
                {
                    // display accout status in UI by delegate-wrapped event
                    // delegate and event declarations are somewhere else
                    // and work fine...
                    if (DisplayAccountStatusEvent != null)
                        DisplayAccountStatusEvent(Acct);
    
                }
                catch (Exception ex)
                {
                    ....
                }
    
        }
    
        private void OnDisplayAccountStatusEvent(Account acct)
        {
                    // call service function results in deadlock
                    Account acct = GetCurrentAccount();
    
        }
    

    }

    该服务是Duplex - 使用WSDualHttpBinding。

2 个答案:

答案 0 :(得分:1)

死锁似乎是由于您在处理上一次调用的回调时进行了新的绑定调用。

错误消息指出您可以通过“在CallbackBehaviorAttribute上指定Reentrant或Multiple的ConcurrencyMode”来解决它。

修改

我错过了屏幕上的代码。要检查的事情:

  • 为什么需要单一的实例模式?
  • 更改并发模式后是否更新了服务引用?

答案 1 :(得分:0)

你的客户是什么?它是UI客户端吗?如果是这样,您需要将callbackBehavior UseSynchronizationContext = false添加到实现回调契约的客户端。