WCF XML-сериализация и перегрузка - PullRequest
0 голосов
/ 15 декабря 2009

В моей службе WCF мне нужна только 1 конечная точка (1 URI), однако я хочу, чтобы этот URI мог обрабатывать несколько типов запросов. 5 различных типов запросов могут быть отправлены на эту услугу от другой компании. Каждый запрос имеет уникальные XML-схемы.

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

В каждом XML-запросе есть узел с именем «requestType». Я пытаюсь понять, что будут делать другие ... я должен сериализовать самостоятельно и игнорировать встроенную сериализацию из DataContract? Какой тип параметра я должен установить для своей функции, чтобы она принимала ... XMLDocument, затем основанный на ответвлении requestType в логику запроса?

Возвращенный XML из этой функции также уникален в зависимости от типа запроса .... однако я не могу вернуть XMLDocument из OperationContract ... выдается больше ошибок (я думаю, потому что он сказал, что его нельзя сериализовать).

Я попытался создать класс, который можно сериализовать из всех типов запросов, установив

IsRequired = false, EmitDefaultValue = false

... в DataMembers для объектов, которые не являются общими для разных типов запросов. Сейчас я сталкиваюсь с проблемой, когда Order должен быть правильно установлен для каждого DataMember, иначе он не будет сериализован в мой объект класса .... Я бы подумал, что Order не нужно устанавливать: /

Edit:

Это то, что я сейчас использую ... XML размещен в моем сервисе.

[WebHelp(Comment = "comment")]
[WebInvoke(UriTemplate = "foobar",
            Method = "POST",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
public ResponseType foobar(ReqeustType request)
...

При тестировании я бы отправил XML на http://localhost:4011/XMLWCF/Service.svc/foobar

1 Ответ

1 голос
/ 15 декабря 2009

У меня будет одна конечная точка службы, например, один URL, но я бы четко определил пять отдельных уникальных методов обслуживания в контракте на обслуживание и реализовал их отдельно.

Это, на мой взгляд, самое простое и чистое решение.

[ServiceContract(Namespace=".......")]
interface IYourService
{
   [OperationContract]
   ReturnValue1 YourMethodNo1(int a, int b);

   [OperationContract]
   ReturnValue2 YourMethodNo2(........);

   [OperationContract]
   ReturnValue3 YourMethodNo3(..........);

   [OperationContract]
   ReturnValue4 YourMethodNo4(...........);

   [OperationContract]
   ReturnValue5 YourMethodNo5(........);
}

Вы не можете иметь только один метод обслуживания, который получает пять различных типов параметров. Кроме того, WCF не поддерживает перегрузку методов - поскольку WSDL не поддерживает его. Все ваши методы должны иметь уникальное имя и иметь определенные и очищенные типы параметров.

Вы могли бы использовать общий параметр типа Message - но это, на мой взгляд, довольно сложно. Эта страница MSDN или сообщение в блоге проливают некоторый свет на то, как это сделать - если вы действительно хотите ...

ОБНОВЛЕНИЕ: в этом сценарии, который я описал, у вас будет ONE URL службы - http://site.com/service.svc.

Из этого URL службы вы создадите клиентский прокси на стороне клиента, который будет иметь пять вызываемых методов:

* * +1025 (псевдо-код): * 1 026 *
class ClientProxy
{       
   ReturnValue1 YourMethodNo1(int a, int b);
   ReturnValue2 YourMethodNo2(........);
   ReturnValue3 YourMethodNo3(..........);
   ReturnValue4 YourMethodNo4(...........);
   ReturnValue5 YourMethodNo5(........);
}

Из вашего клиентского кода вы бы затем вызвали любой из этих пяти методов:

ReturnValue1  result = ClientProxy.YourMethodNo1(5, 7);

но все будет идти по URL-адресу единого сервиса .

...