Служба WCF SOAP 1.2 ожидает тип содержимого SOAP 1.1
Я создаю веб-службу WCF, которая требует взаимодействия с клиентами, не относящимися к WCF (на самом деле клиентов WCF не будет).
Я уже написал WSDL с использованием SOAP 1.2 (согласно этому примеру). Я проверил WSDL и использовал этот файл (не WSDL, сгенерированный WCF, который внешне отличается) для созданияSoapUI тестовый проект.
У меня есть требование, чтобы веб-сервис поддерживал SOAP 1.2, поэтому я не могу просто вернуться к SOAP 1.1 (который отлично работал в раннем прототипе).
Я использовалWSCF.blue генерировать мой сервис WCF, интерфейс и классы контрактов данных. Все хорошо компилируется, и конечная точка открывается, если я запускаю службу WCF в своем браузере. Кажется, все хорошо с миром.
Когда я пытаюсь вызвать метод из soapUi, я получаю следующий ответ от сервера (как видно из soapUI):
<code>HTTP/1.1 415 Cannot process the message because the content type 'application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing"' was not the expected type 'text/xml; charset=utf-8'. Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Mon, 30 Apr 2012 08:15:29 GMT Content-Length: 0 </code>
(Фактические имена методов и пространства имен были изменены вручную для целей этого вопроса. Любые опечатки в пространстве имен не являются ошибками в моем коде - просто упущение при наборе этого вопроса)
Я знаю, что SOAP 1.1 указывает, что тип контента должен бытьtext/xml, SOAP 1.2 требуетapplication/soap+xml.
Мой необработанный запрос (согласно soapUI):
<code>POST http://localhost/MyWs.svc HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://tempuri.org"> <soap:Header/> <soap:Body> <ns:fetchMyThingRequest attribute1="1" attribute2="10"> </ns:fetchMyThingRequest> </soap:Body> </soap:Envelope> </code>
Из этого ответа он сообщает, что мой запрос сформирован правильно - это запрос SOAP 1.2 с правильным типом содержимого. Моя служба WCF, однако, не ожидает этот тип контента, что, как я предполагаю, означает, что я не настроил его правильно, и все еще считает, что это веб-служба SOAP 1.1.
Минимальный Web.config, согласноэтот блог:
<code><system.serviceModel> <services> <service name="MyNamespace.MyPort"> <endpoint address="" binding="customBinding" bindingConfiguration="httpSoap12" contract="IWsPort12" /> </service> </services> <bindings> <customBinding> <binding name="httpSoap12"> <textMessageEncoding messageVersion="Soap12" /> <httpTransport /> </binding> </customBinding> </bindings> </system.serviceModel> </code>
Фрагмент договора на обслуживание:
<code>[ServiceContract(Namespace = "http://tempuri.org")] public interface IWsPort { [OperationContract(Action = "http://tempuri.org/FetchMyThing")] [FaultContract(typeof(WsFault), Action = "http://tempuri.org/FetchMyThing", Name = "fetchMyThingFault")] [XmlSerializerFormat(SupportFaults = true)] FetchMyThingResponse FetchMyThing(FetchMyThingRequest request); } </code>
Я включил трассировку службы для моей службы WCF и вижу следующее исключение, которое, кажется, подтверждает мою гипотезу:
<code>Activity: Listen at 'http://mycomputer/MyWs.svc <Exception> <ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> <Message>Content Type application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" was sent to a service expecting text/xml; charset=utf-8. The client and service bindings may be mismatched. </Message> (erroneous detail snipped) </Exception> </code>
Таким образом, мои контрактные и сервисные привязки, вероятно, не совпадают, если верить этому сообщению, но из того, что я понимаю в WCF, моя конфигурация (или, по крайней мере, намерение за ней) верна.
У кого-нибудь есть идеи относительно того, что не так с моей конфигурацией?