问题: 在WCF客户端中获取死锁异常消息。
场景:
服务调用客户端回调(此调用完全独立,由服务器上的某些条件启动)。
在客户端回调函数中,客户端调用服务中的函数,并且在抛出死锁异常时:
此操作将死锁,因为在当前消息完成处理之前无法接收回复。如果要允许无序消息处理,请在CallbackBehaviorAttribute上指定Reentrant或Multiple的ConcurrencyMode。
我试图尽可能地简化代码。我读过这篇文章,但仍然无法找到问题所在:http://msdn.microsoft.com/en-us/library/cc294424.aspx 我很感激任何建议......
[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。
答案 0 :(得分:1)
死锁似乎是由于您在处理上一次调用的回调时进行了新的绑定调用。
错误消息指出您可以通过“在CallbackBehaviorAttribute上指定Reentrant或Multiple的ConcurrencyMode”来解决它。
修改强>
我错过了屏幕上的代码。要检查的事情:
答案 1 :(得分:0)
你的客户是什么?它是UI客户端吗?如果是这样,您需要将callbackBehavior UseSynchronizationContext = false添加到实现回调契约的客户端。