2011-01-04 3 views
0

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

Похоже, что WCF предоставляет множество функциональных возможностей для использования слоя «Канал». Например, чтобы создать сервер, вы можете создать прослушиватель каналов из привязки и вызвать WaitForRequest, Ответить и т. Д. Эти методы связаны с объектами 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.

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

Любые предложения?

+0

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

+0

Добавил некоторую информацию. Вы хорошо разбираетесь в маршрутизации. Мой случай достаточно прост, когда я делаю это сам, но я не вижу причин, по которым маршрутизация не может быть отделена от Channel Layer также ...объект сообщения должен иметь всю информацию, необходимую для выполнения маршрутизации, не так ли? – JimSteele1222

ответ

0

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

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

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

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

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

+0

Я боялся столько же ... XmlObjectSerializer не совсем делает трюк по нескольким причинам. Я попытаюсь вытащить реализации IDispatchMessageFormatter из моно. Несчастливо, но лучше, чем начинать с нуля :) – JimSteele1222

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