Прямой доступ к слою ServiceModel - PullRequest
0 голосов
/ 05 января 2011

Я новичок в WCF, поэтому прошу прощения, если я пропустил лодку полностью.

Похоже, что WCF предоставляет множество функциональных возможностей для использования самого слоя "Channel".Например, чтобы создать сервер, вы можете создать прослушиватель канала из привязки и вызвать WaitForRequest, Reply и т. Д. Все эти методы имеют дело с Message объектами, так что вы должны что-то делать ссообщение.

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

Message requestMessage = GetMessageSomehow();
OperationDescription oc = GetContractForMessage();
Message replyMessage = Invoke(myService, oc, requestMessage);

По крайней мере, если бы я мог как-то получить доступ к IOperationInvoker и IDispatchMessageFormatter объектам, которые получаютСозданный для типа, было бы довольно просто объединить их в цепочку, чтобы получить требуемую функциональность.

В моем конкретном случае мне нужно реализовать несколько простых сервисов Soap 1.1 и 1.2 (без WS-Addressing).У меня уже есть объекты HttpListenerRequest / Response, и я могу маршрутизировать их на основе заголовка SOAPAction или ContentType.

Я думаю, что эта функциональность также была бы весьма полезна для модульного тестирования.Например, мне нужно реализовать для существующих клиентов.Было бы неплохо иметь модульные тесты, в которых я мог бы проверить, что Атрибуты класса обслуживания верны (то есть, что сообщение, которое я знаю, которое я получу, будет правильно преобразовано в вызов на моем интерфейсе службы).

Есть предложения?

1 Ответ

0 голосов
/ 05 января 2011

Сериализация / десериализация из этого экземпляра сообщения в фактические параметры для вызова обычно выполняется IDispatchMessageFormatter / IClientMessageFormatter .

На стороне сервера IDispatchMessageFormatterвводится в DispatchRuntime с помощью пользовательского поведения операции, которое вставляет сериализатор контракта данных (или другой сериализатор).

Но ... если вы не используете ServiceHost, DispatchRuntime отсутствует.По сути, если вы хотите всего этого, вам придется выполнять всю тяжелую работу самостоятельно:)

Тем не менее, если вы можете получить объект OperationDescription, вы должны иметь возможность создавать экземпляр DataContractSerializerOperationBehavior,но вы не сможете извлечь из него IDispatchMessageFormatter ... вы можете получить XmlObjectSerializer , хотя это может или не может быть полезным для вас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...