簡體   English   中英

WCF回調未在客戶端調用,並在服務器端掛起

[英]WCF callback not invoked on the client-side and hangs on the server-side

我有一個WCF服務,它對於常規客戶端 - >服務器調用非常好。 但是我試圖在服務中引入一個簡單的回調,但它不起作用......最終我不確定我哪里出錯了所以讓我告訴你設置並告訴你我所知道的。

1)合同

public interface IPIRSCallbackService
{
    [OperationContract]
    void OnCallback();
}

[ServiceContract(CallbackContract = typeof(IPIRSCallbackService))]
public interface IPIRSService
{ etc...

2)服務器合同實施

注意:我檢查回調通道的狀態,它是“打開” - 不知道這是多少值得。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
class PIRSService : IPIRSService
{

    public PIRSService()
    {
        callback = OperationContext.Current.GetCallbackChannel<IPIRSCallbackService>();
        var x = ((ICommunicationObject)callback).State;
        callback.OnCallback(); // HANGS HERE
    }
    etc.

3)客戶端 - 創建代理

現在,這可能不是您將看到的常見方式,因為我使用ViewModelLocator將服務注入到我的視圖模型中...但我確信這不會導致問題...並注意到正常的服務調用工作絕對沒問題。

ViewModelLocator注冊服務實例

       SimpleIoc.Default.Register<PIRSService>(() =>
            {
                IPIRSCallbackService callback = new PIRSCallbackService(); 
                InstanceContext context = new InstanceContext(callback);
                return new PIRSService(context, "PIRSClient");
            }, true);

       SimpleIoc.Default.Register<IPIRSService>(() => 
            {
                return SimpleIoc.Default.GetInstance<PIRSService>();
            }, true);

4)連接到服務

    DuplexChannelFactory<IPIRSService> channelFactory = new DuplexChannelFactory<IPIRSService>(callbackContext, endpointConfigName);
    channelFactory.Credentials.UserName.UserName = userName;
    channelFactory.Credentials.UserName.Password = password;
    proxy = channelFactory.CreateChannel();
    ((IClientChannel)proxy).Open();

5)客戶端 - 端點配置

  <endpoint address="net.tcp://localhost:20437/PIRSService" binding="netTcpBinding"
    bindingConfiguration="StandardNetTcpBinding" contract="PIRS_Common.Service.IPIRSService"
    name="PIRSClient" kind="" endpointConfiguration="" behaviorConfiguration="CustomBehavior">
    <identity>
      <dns value="WCfServer" />
    </identity>
  </endpoint>

所以,我不知道為什么沒有觸發回調協議的客戶端實現...因此服務器端調用回調方法會掛起調用...因為它正在等待回調完成。 我確信回調沒有正確注冊是一個問題...但我不確定我做錯了什么。 我是否需要在客戶端端點或其他任何位置注冊回叫合同?

您可以確保將“ConcurrencyMode.Multiple”添加到實現回調的類的“CallbackBehavior”屬性中。

[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)] 

回調ConcurrencyMode參考:
http://blogs.msdn.com/b/dsnotes/archive/2013/09/18/wcf-callback-operations-are-invoked-sequentially.aspx

此外,如果您還沒有,可能需要考慮啟用WCF跟蹤以確保服務器確實正在調用客戶端回調方法。

WCF跟蹤參考: http//msdn.microsoft.com/en-us/library/ms733025.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM