Я не могу достичь 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 для обратного вызова, но контекст не будет тот, который вы ожидаете. Отбросьте статический сигнал и посмотрите, нет ли ошибок в файле журнала.