Проблема с подключением к WCF сервисам захосченным в одном .net приложении.
От: sleepw41ker Россия  
Дата: 14.05.12 08:18
Оценка:
Привет сообщество.
У меня есть проблема. Я пытаюсь подключиться к одному wcf сервису из другого в следующей ситуации:

У меня есть wcf сервис, назовём его условно Component (с контрактом IComponent). Я создаю в приложении несколько экземпляров этого сервиса (для теста два) и размещаю их в моём приложении. Так же у меня есть второй wcf сервис, назовём его условно Server (с контрактом IServer). Единственный экземпляр этого Server хостится в обычном windows сервисе. Эти сервисы имеют друг на друга референсы и знают о контрактах друг друга. То есть взаимодействуют они в обе стороны, но не через колбэки, а через контракты, поднимая соответствующих клиентов.
При старте моей программы создаётся два экземпляра компонента, они соединяются с сервером и докладывают о своём существовании. Всё проходит штатно. Затем сервер пытается соединиться с одним из компонентов, что бы, в свою очередь, вызвать некий метод у него. Но в момент открытия криента для компонента я получаю эксепшен "There was no endpoint listening at net.tcp://localhost:8732/TestComponent_6a4009df-cc68-4cd9-9414-16737c734548 that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details."

Собственно, это и есть проблема.

Уточню, адреса у всех компонентов в приложении у меня разные (гуид в uri указывает на это), но работает всё на одном порту. Портшаринг включен и работает, так как сервер тоже висит на этом порту. Кроме того, если я создаю в приложении только один экземпляр компонента и запускаю несколько экземпляров приложения, то все они успешно конектятся к серверу, а сервер успешно с ними общается.

И немножко кода:

Вот так создаётся два экземпляра компонента:
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
  Component = new TestComponent("net.tcp://localhost:8732/TestComponent", Component_OnMessageReceivedEvent); 
  Component.JoinServer(); 
  Component2 = new TestComponent("net.tcp://localhost:8732/TestComponent", Component_OnMessageReceivedEvent); 
  //guids is added to addresses in TestComponent constructor 
  Component2.JoinServer(); 
}


а вот так выглядит JoinServer

public void JoinServer() 
{ 
  this.StartComponentHosting(); 
 
  if (ServerClient != null) 
  { 
    ServerClient.Close(); 
    ServerClient = null; 
  } 
 
  ServerClient = new ServerClient(); 
  ServerClient.Open();  //conneting to server 
  ServerClient.JoinComponent(this.ProviderInfo); //calling some method on server
} 
 
private void StartComponentHosting() 
{ 
  if (ComponentHost != null) 
  { 
    ComponentHost.Close(); 
  } 
 
  ComponentHost = new ServiceHost(this); 
  var portsharingBinding = new NetTcpBinding("NetTCPBindingConfig") { PortSharingEnabled = true }; 
  ComponentHost.AddServiceEndpoint(typeof(IComponent), portsharingBinding, this.Address); 
  ComponentHost.Open(); 
}


Есть мысли, как такое вылечить?
.net c# wcf
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.