Привет сообщество.
У меня есть проблема. Я пытаюсь подключиться к одному 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();
}
Есть мысли, как такое вылечить?