Хостинг и использование службы WCF из одного процесса - PullRequest
3 голосов
/ 24 декабря 2009

Можете ли вы стать клиентом Службы WCF из Процесса, в котором размещается Служба WCF? Я пытался создать отдельные домены приложений в рамках одного и того же процесса, но все еще безуспешно. Подтверждено, что сервис доступен по протоколам Http, Net.TCP и Net.Pipe.

Спасибо за любую помощь!

Nat

Ответы [ 4 ]

3 голосов
/ 07 ноября 2012

У меня была такая же проблема, даже при использовании InProcFactory из ServiceModelEx.

Оказывается, как описано здесь , вам нужно установить ServiceBehavior на , а не UseSynchronizationContext.

[ServiceBehavior(UseSynchronizationContext = false)]
public class MyService : IMyService {}
2 голосов
/ 24 декабря 2009

Вы можете попробовать использовать сборку ServiceModelEx IDesign, которая упрощает процесс создания внутрипроцессного клиента для службы WCF.

Сборка включает класс InProcFactory, который динамически создает конечную точку Net.Pipe и прокси для вашей службы.

ServiceModelEx от IDesign.net

1 голос
/ 24 мая 2011

Я не знаю, в чем заключалась ваша конкретная проблема, но у меня также была проблема с использованием служб WCF в рамках того же процесса. Моя проблема заключалась в том, что мое приложение зависало на минуту после вызова службы из клиента и, наконец, возвращалось с исключением по таймауту. Я предполагаю, что это как-то связано с блокирующим вызовом в потоке во время ожидания ответа от сервера ... что является проблемой, если сервер блокируется. Я использовал именованные каналы, я не пробовал другие варианты.

Предложение Самсона выше, вероятно, работает, но я сделал это другим способом. Я создал службу и слушатель через поток вместо вызова размещенной службы в потоке. Это, кажется, работает просто отлично.

Теперь что-то немного не по теме - Firestrand спросил, почему вы хотели бы сделать это из своего собственного приложения. Я создаю службу Windows и отдельный пользовательский интерфейс приложения WPF, для которого она должна взаимодействовать. Тем не менее, отладка служб Windows является своего рода болью, поэтому большая часть работы службы, включая вызовы WCF, уходит в отдельную библиотеку DLL, на которую я могу ссылаться в приложении пользовательского интерфейса, находясь в «тестовом» режиме, который, по сути, просто вызывает процедуры запуска. что фактическая служба Windows будет. Это позволяет мне отлаживать как пользовательский интерфейс, так и «симулированный» сервис без привязки к процессам, запуска нескольких процессов и т. Д. Кажется, он работает отлично. Как только пользовательский интерфейс и DLL будут завершены, я просто создам реальную службу Windows, которая по сути является просто оболочкой для DLL, а затем, по крайней мере, скрываю тестовый режим в пользовательском интерфейсе. Просто подумала, что поделюсь, если кто-то найдет такой подход полезным.

1 голос
/ 07 января 2010

Да. После размещения службы WCF необходимо вызвать метод размещенной службы в отдельном потоке.

...