2016-06-22 2 views
1

Использование WCF, .NET 4.5, Visual Studio 2015, и вы хотите использовать для каждого сеанса, а не singleton. Предоставляемые услуги должны быть полнодуплексными, через tcp.net.WCF - как подключиться к конкретному экземпляру

Предположим, у меня есть две машины, A & B ...

В качестве клиента, подключается к «сервис» при условии, в качестве службы WCF на той же машине B, и начинает говорить с ним, назовем его объект "ИКС". Он также подключается к другому экземпляру одной и той же службы, называет его объектом «Y»

В качестве клиента, который хочет подключиться к тем же объектам, с которыми разговаривает B, и использовать их, объекты «X» и «Y», , за исключением того, что теперь это удаленный-удаленный, а не локальный-удаленный.

«X» и «Y» на самом деле являются видеосерверами, и у обоих есть «состояние».

Могу ли я это сделать? Как, когда я являюсь клиентом, я указываю, какой экземпляр WHICH я хочу подключиться?

Очевидно, что на машине «B» я мог бы уклониться от этого, предоставляя услуги просто передними концами без «состояния», которые обмениваются данными с некоторыми процессами, запущенными на «B», но для этого мне потребуется написать пучок кода interprocess, который я ненавижу.

Ожидается, что в машине B будет запущено 100 экземпляров этих «видеосерверов», в каждом из которых разговаривают с помощью локальной мастер-станции (singleton), и с ними разговаривают машины конечного пользователя.

Я понимаю, что этот вопрос немного обобщен, но он также затрагивает вопрос, который я не мог найти, или ответил на Интернет.

Я просто подумал о одном возможном, но решении kludge-y: поскольку главная служба является одноэлементной, когда экземпляр службы «X» создается конечным пользователем, он может подключиться к основной службе singleton, используя прокси для синглтона. Затем синглтон может говорить назад к экземпляру «X» по каналу обратного вызова. Да, это сработает! беспорядочно, но возможно.

Я все еще хотел бы знать, может ли конечный пользователь A и конечный пользователь B разговаривать с одним и тем же (не одиночным) экземпляром службы на компьютере C через некоторые манипуляции с манипуляциями с каналами или что-то в этом роде. Насколько я понимаю правила WCF, это просто невозможно. Возможно, может быть, если вы принимаете обслуживание самостоятельно, а не IIS, но даже тогда я не думаю, что это возможно?

ответ

1

Я столкнулся с той же проблемой и решил ее, создав две служебные ссылки, одну для локальной для пульта. Назовем это LocalServiceClient и RemoteServiceClient.

В классе, создать свойство Client (или что вы хотите назвать его):

public LocalServiceClient Client { 
    get { 
      return new LocalServiceClient(); 
    } 
} 

Хорошо это лишь один из них.Просто создайте другой сейчас, и установить, какие из них использовать с флагом компилятора:

#if DEBUG 
public LocalServiceClient Client { 
    get { 
      return new LocalServiceClient(); 
    } 
} 
#else 

public RemoteServiceClient Client { 
    get { 
      return new RemoteServiceClient(); 
    } 
} 
#endif 

Instantiate все экземпляры ваших Client используя var ключевое слово, поэтому он будет неявно типизированных, или просто использовать Client непосредственно:

var client = Client; 
client.DoSomething... 
//or 
Client.DoSomething... 

Таким образом, когда вы работаете локально, он будет подключаться к локальной службе и в конфигурации выпуска (убедитесь, что вы находитесь на Release при публикации), она будет компилироваться для удаленного. Убедитесь, что у вас есть одна и та же подпись/код для обеих служб, хотя на стороне WCF.

Есть также методы, которые вы можете динамически делать в коде, или как в web.config, они также будут работать точно, но они, как правило, являются излишним. Вероятно, вам нужно подключиться к локальному при отладке, а удаленный - в производстве, и это даст вам именно то, что вам нужно.

Смежные вопросы