Я создаю веб-службу WCF, которая требует взаимодействия с не-WCF-клиентами (на самом деле не будет клиентов WCF).
Я уже написал WSDL, используя SOAP 1.2 (в соответствии с этим примером). Я проверил WSDL и использовал этот файл (а не WSDL, сгенерированный WCF, который внешне отличается), чтобы создать тест soapUI проект.
У меня есть требование, чтобы веб-служба поддерживала SOAP 1.2, поэтому я не могу просто вернуться к SOAP 1.1 (который отлично работал в раннем прототипе).
Я использовал WSCF.blue для создания моих WCF-сервисов, интерфейсов и классов контрактов данных. Все компилируется красиво, и конечная точка отображается, если я ударил службу WCF в своем браузере. Все кажется хорошо с миром.
Когда я пытаюсь вызвать метод из soapUi, я получаю следующий ответ от сервера (как видно из soapUI):
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
(Фактические имена методов и пространства имен были изменены вручную для целей этого вопроса. Любые опечатки в пространстве имен не являются ошибками в моем коде - просто надзор при вводе этого вопроса)
Я знаю, что SOAP 1.1 указывает, что тип содержимого должен быть text/xml. Для SOAP 1.2 требуется application/soap + xml.
Мой необработанный запрос (согласно soapUI):
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>
Из этого ответа он сообщает мне, что мой запрос правильно сформирован - это запрос SOAP 1.2 с правильным типом контента. Однако мой WCF-сервис не ожидает такого типа контента, который, как я полагаю, означает, что я не настроил его правильно, и он все еще считает его веб-сервисом SOAP 1.1.
Минимальный Web.config, согласно этот пост в блоге:
<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>
Отрывок контракта на обслуживание:
[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);
}
Я включил трассировку службы для моей службы WCF и вижу следующее исключение, которое, похоже, подтверждает мою гипотезу:
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>
Таким образом, мои контракты и привязки к сервисам, вероятно, несовместимы, если это сообщение должно верить, но из того, что я понимаю из WCF, моя конфигурация (или, по крайней мере, намерение позади нее) верна.
Есть ли у кого-нибудь идеи относительно того, что не так с моей конфигурацией?