Позвоните на веб-сервис без прокси - PullRequest
3 голосов
/ 28 февраля 2010

Мне нужно вызвать веб-сервис из-за отсутствия программы на C #. Веб-сервис, скорее всего, не стандартный формат. Описание интерфейса (wsdl и xsd) очень сложное, и использование механизма генерации прокси приводит к сотням классов. Сгенерированные классы мало помогают, поскольку они очень универсальны и имеют в основном простые типы объектов в качестве членов. Лучший вариант - создать сообщение SOAP вручную. Это также способ, которым поставщик веб-услуг предложил выбрать: взять сообщения мыла / xml, которые необходимо отправить, и построить сообщение в соответствии с шаблоном. Теперь вопрос в том, как построить сообщение наиболее эффективно. Конечно, жесткое кодирование строки сообщения - это вариант, однако мне интересно, существуют ли лучшие варианты. Если у меня есть полное сообщение в строке, как мне лучше всего отправить сообщения. Должен ли я использовать простой HttpRequest или я могу использовать механизмы стека wcf? Мой текущий подход к созданию сообщения выглядит так:

string msg = envelopeBegin;
RouteType rootType = new RouteType();
XmlSerializer serializer = new XmlSerializer(typeof(RouteType));
StringWriter stringWriter = new StringWriter();
serializer.Serialize(stringWriter, rootType , customNamespace);
msg += stringWriter.ToString();
msg += envelopeEnd;

// Отправить сообщение по сети

Сообщение Soap / xml, которое я должен сгенерировать, выглядит следующим образом

<env:Envelope>xmlns:env=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://www.skanska.se/oagis/9/ws/faults"> 
<env:Body> 
<ska:ShowSalesOrder xmlns:ska="http://www.skanska.se/oagis/9" systemEnvironmentCode="UTV" versionID="1.0" releaseID="9.0"> 
<!--plsql=.74s--> 
<ApplicationArea xmlns="http://www.openapplications.org/oagis/9"> 
<!--user_name=SEBA_RAPPE--> 
<ska:Sender> 
<LogicalID>OEBS_SE</LogicalID> 
<ComponentID>SKAIS017I</ComponentID> 
<AuthorizationID>SEBA_RAPPE</AuthorizationID> 
<ska:ResponsibilityID>XXOM_INTEGRATION_SVT</ska:ResponsibilityID> 
</ska:Sender> 
<CreationDateTime>2010-02-26T15:03:27+01:00</CreationDateTime> 
<BODID>xxxxxxxxxxxxxxxxx</BODID> 
</ApplicationArea> 
<ska:DataArea> 
<Show xmlns="http://www.openapplications.org/oagis/9"> 
<ResponseCriteria> 
<ResponseExpression actionCode="Never" expressionLanguage="xPath">*</ResponseExpression> 
</ResponseCriteria> 
</Show> 
<ska:SalesOrder> 
<SalesOrderHeader xmlns="http://www.openapplications.org/oagis/9"> 
<DocumentID> 
<ID>141779</ID> 
</DocumentID> 
<RequestedShipDateTime>2009-11-04T07:00:54+01:00</RequestedShipDateTime>
</SalesOrderHeader>
</ska:SalesOrder>
</ska:DataArea>
</ska:ShowSalesOrder>
</env:Body>
</env:Envelope> 

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Определенно вы все еще можете использовать инфраструктуру WCF, не требуя определения типов для всех различных сообщений.WCF специально поддерживает это через класс Message .Использовать его не так уж сложно.Вот еще немного информации о них, но идея в основном заключается в том, что для чтения и записи сообщений вы будете использовать устройства чтения и записи XML.

0 голосов
/ 28 февраля 2010

Один из способов сделать это - создать шаблон XML-скелета, содержащий заполнители для значений. Прочитайте XML и замените значения значениями из вашего объекта. Отправьте полученный XML-код в веб-службу, используя HttpWebRequest .

Даже если этот подход может сработать, я настоятельно рекомендую вам создать прокси-класс WCF и использовать его вместо этого, даже если веб-служба содержит сотни неиспользуемых методов и объектов. Пока это действительный WSDL, WCF будет обрабатывать его. Также, если есть какие-либо изменения в веб-сервисе, все, что вам нужно сделать, это восстановить прокси. Чтобы избежать уродства этого веб-сервиса, создайте свою собственную инфраструктуру, которая предоставляет только полезные методы и классы и скрывает реальный вызов.

...