Прямой POST для WCF WSDL-первый веб-сервис - PullRequest
0 голосов
/ 02 июня 2011

Мне нужна помощь в публикации XML в сервис WCF.По сути, проблема, с которой я сталкиваюсь, - это HTTP-ответ «400: Плохой запрос» - как бы наглядно это ни звучало, я изо всех сил пытаюсь найти какие-либо ответы!

Прежде всего, сервис, который я создалв WCF основан на существующем WSDL, изначально взятом из веб-службы IBM WebSphere.После некоторых манипуляций (удаление вложений MIME, загрузка некоторых удаленных схем) мне удалось заставить svcutil сгенерировать интерфейс службы, который для всех целей и задач представляется действительным.

Я реализовал интерфейс в моей службе WCFи при запуске тестового клиента WCF я могу подключиться к сервису, отправить запрос и получить ответ без проблем.Пока все хорошо!

При переходе к тестовому приложению для публикации XML в веб-сервисах через класс HttpWebRequest я начинаю получать ответы «400: Плохой запрос», даже если я использую XML, предоставленный тестовым клиентом WCF.

Я использовал трассировку WCF для вывода сообщений, которые он получает, и есть одно поразительное отличие - все сообщения тестового клиента WCF заполнены правильно и отображают информацию о заголовке и т. Д., Все один раз измоя утилита для тестирования SOAP отображается как «Неправильно».Глядя на вкладку сообщений, отправляемые вручную сообщения POST имеют тело, заключенное в элемент:

<MessageLogTraceRecord><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>
]]></MessageLogTraceRecord>

В то время как сообщения WCF выглядят так:

<MessageLogTraceRecord>
<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<Connection>Keep-Alive</Connection>
<Content-Length>185</Content-Length>
<Content-Type>text/xml; charset=utf-8</Content-Type>
<Accept-Encoding>gzip, deflate</Accept-Encoding>
<Expect>100-continue</Expect>
<Host>localhost:57567</Host>
<VsDebuggerCausalityData>uIDPo4VLDcJD5AZDjB5sdmoeakEAAAAAH/hWABuWQ0iiq47QDHh0GlelCLcEx7FLibxRvpq1tTgACQAA</VsDebuggerCausalityData>
<SOAPAction>"http://www.nowhere.co.uk/RequestService/RequestOperation"</SOAPAction>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>
</MessageLogTraceRecord>

У меня естьПопытка трассировки в Fiddler безрезультатна - я не могу заставить тестового клиента WCF отправлять запросы через созданный им прокси, несмотря на изменение файла app.config.Я проследил мой SOAP-запрос, однако могу видеть следующее:

Content-Type: text/xml; charset="utf-8"
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:57567
SOAPAction: "http://www.nowhere.co.uk/RequestService/RequestOperation"
Content-Length: 459
Expect: 100-continue
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>

Насколько я могу судить, отправляемое сообщение должно быть в порядке - вне заголовков и содержимого сообщения, которое я не могупосмотрим, что еще можно отправить.

Последнее, что я должен сказать, это то, что я ни в коем случае не эксперт WCF, и мне пришлось изменить конкретное значение SOAPAction из-за коммерческой чувствительности ..

Кто-нибудь может предложить какую-нибудь помощь по этой довольно неприятной проблеме?

Заранее спасибо

1 Ответ

0 голосов
/ 03 июня 2011

Спасибо за комментарий Fiddler - мне удалось отследить запрос WCF, и использование xml из запроса, похоже, работает! С тех пор я попробовал полное сообщение, которое работает против службы WebSphere против клиента WCF, и это тоже работает!

Я думаю проблема заключалась в заголовке Action. Я полагаю, что WCF поддерживает только пару ревизий WSA, ни одна из которых не является той, которую использовал данный WSDL. При рассмотрении исходных запросов, которые не выполнялись (извлечены из клиентского интерфейса WCF Test Client), используемое им пространство имен адресации было объявлено как:

xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"

Принимая во внимание, что фактический запрос WCF, который передается службе, объявляется как:

xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"

Сам фактический элемент был заполнен тем же значением, только разница в пространстве имен:

<wsa:Action>http://www.nowhere.co.uk/RequestService/RequestOperation</wsa:Action>

Таким образом, использование правильной версии адресации и пропуск более новой версии, совместимой с WCF, по-видимому, устранили проблему!

...