DuplexProxy не может вызвать контракт на обслуживание wcf, даже если служба запущена

#c# #wcf

#c# #wcf

Вопрос:

У нас есть служба wcf, которая работает с привязкой к сетевому протоколу tcp и имеет контракт обратного вызова. Когда я пытаюсь вызвать метод службы, используя канал duplex proxy, получаю следующую ошибку. служба запущена, но не смогла подключиться к прокси-клиенту.

C#

 this.Invoke(p => p.Subscribe(), true);

public void Invoke(Action<T> call, bool keepOpen)
{
    T proxy = GetProxy();            
    call(proxy);
}

public T GetProxy()
{
    NetTcpBinding binding = new NetTcpBinding("");                   
    EndpointAddress address = new EndpointAddress(new Uri("net.tcp://"   Server   RelativeUrl), EndpointIdentity.CreateSpnIdentity(Server   "/"   Environment.MachineName));
    factory = new DuplexChannelFactory<T>(new InstanceContext(callbackInstance), binding, address);
    T proxy =  factory.CreateChannel();
    ((IClientChannel)proxy).Open(); 
    return proxy;
}
  

Обслуживание

 [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IWorkflowChanged))]
public interface IWorkflowChangedPublisher
{
    [OperationContract(IsOneWay = false)]
    void Subscribe();
}

public interface IWorkflowChanged
{
    [OperationContract(IsOneWay = true)]
    void WorkflowChanged(WorkflowChangedEventArgs args);
}
  

Получаем следующее исключение:

 Server stack trace: 
at System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:  

at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageDataamp; msgData, Int32 type)
at Tradar.Workflow.Service.IStatusPublisher.Subscribe()
at Tradar.Workflow.StatusMonitor.<>c.<Open>b__16_0(IStatusPublisher p) in D:PMARepobackofficeInsightModulesWorkflowCoreStatusMonitor.cs:line 139
at Tradar.Workflow.ProxyFactory`1.Invoke(Action`1 call, Boolean keepOpen) in D:PMARepobackofficeInsightModulesWorkflowCoreProxyFactory.cs:line 79
  

Комментарии:

1. Можете ли вы добавить хотя бы контракты, а лучше код?

2. @StefGeysels, пожалуйста, взгляните сейчас.

3. Оптимизируйте свой проект и опубликуйте более подробную информацию о том, как вы размещаете службу. Кроме того, в дуплексном режиме IsOneWay операции всегда имеет значение true (или ConcurrencyMode является множественным). И безопасность NetTcpBinding — это Windows, попробуйте настроить безопасность. Фабрика ChannelFactory<IService> = новая фабрика ChannelFactory<IService> (привязка, новый адрес конечной точки (uri)); фабрика. Учетные данные. Windows. Доверенность клиента. Имя пользователя = «администратор»; завод. Учетные данные. Windows. Доверенность клиента. Пароль = «123456»; Служба IService = factory. CreateChannel();