Я не могу достичь OperationContext.Current, когда сохраняю его в статическую переменную

У меня есть служба WCF, которая настроена с помощью привязки net.tcp. Я могу связаться с клиентом по сервису и вызвать его методы. Также я могу связаться с OperationContext.Current. Такие как:

[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IService
{
    [OperationContract(IsOneWay = true)]
    void Register();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Service :IService
    {
        public void Register()
        {
             CallBacker.Client = OperationContext.Current.
                                 GetCallbackChannel<IServiceCallback>();

        }
    }

}

public class CallBacker 
{
   public static IServiceCallback Client { get; set; }

   public void Call(string message)
   {
       Client.Test(message);
   }
}

Когда клиент вызывает метод Register Сервиса, я вижу, что канал сохранен в CallBacker.Client, но когда я вызываю метод "Call" из CallBacker > Call(строковое сообщение), Клиент приходит в ноль.

Странно то, что когда я устанавливаю конфигурацию сервиса из net.tcp в wsdualhttpbinding, он работает отлично. Есть ли разница между net.tcp и wsdualhttpbinding, которые могут вызвать эту странную проблему?

2 ответа

Кажется, что CallbackContract должен иметь тип IServiceCallback [ServiceContract(CallbackContract = typeof(IServiceCallback))]

Ниже приведена конфигурация для wsDualHttpBinding и netTcpBinding.

<services>
  <service behaviorConfiguration="behavior" name="WCFCallbackTry.Service1">
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="HttpEndPoint"
      contract="WCFCallbackTry.IService" name="HttpEndPoint"/>
    <endpoint address="net.tcp://localhost:8004/Service1.svc"  bindingConfiguration="BindingConfiguration" binding="netTcpBinding"
      contract="WCFCallbackTry.IService" name="NetTcpEndPoint"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8018/Service1.svc"/>
      </baseAddresses>
    </host>
  </service>
</services>

Пожалуйста, также найдите используемую netTcpBinding

<netTcpBinding>
    <binding name="BindingConfiguration" receiveTimeout="infinite" sendTimeout="10.00:00:00" maxBufferPoolSize="1073741824" maxBufferSize="1073741824" maxReceivedMessageSize="1073741824">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
      <reliableSession enabled="true" inactivityTimeout="01:00:00" ordered="true" />
    </binding>
  </netTcpBinding>

CallBacker.Client содержит значение CallBackContract при использовании netTcpBinding, и, по-видимому, не возникает никаких проблем, если CallBackContract изменяется на IServiceCallback.

Вы неправильно понимаете значение статики здесь. В этом контексте статическое значение будет одинаковым для каждого экземпляра CallBacker. Тогда с вашим concurency.multiple несколько клиентов одновременно могут использовать ваш callbacker.client для обратного вызова, но контекст не будет тот, который вы ожидаете. Отбросьте статический сигнал и посмотрите, нет ли ошибок в файле журнала.

Другие вопросы по тегам