Прямая отправка POST в веб-службу WCF WSDL-first

Мне нужна помощь в размещении 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 из-за коммерческой конфиденциальности.

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

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


person aaronrhodes    schedule 02.06.2011    source источник
comment
Если fiddler работает неправильно на локальном хосте, попробуйте запустить службу на одном компьютере, а wcftestclient — на другом. Обычно это работает. Что касается выяснения проблемы, попробуйте включить трассировку на стороне сервера, в трассировках должно быть исключение, указывающее, что именно пошло не так.   -  person carlosfigueira    schedule 02.06.2011


Ответы (1)


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

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

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, похоже, решило проблему!

person aaronrhodes    schedule 03.06.2011