Вопрос по wcf – Служба WCF SOAP 1.2 ожидает тип содержимого SOAP 1.1

21

Я создаю веб-службу 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, моя конфигурация (или, по крайней мере, намерение за ней) верна.

У кого-нибудь есть идеи относительно того, что не так с моей конфигурацией?

Ваш Ответ

3   ответа
9

о чем я могу подумать, это то, что вы не указали привязку во многих деталях и используете HTTP (согласно этому: "Слушайте на").Http: //mycomputer/MyWs.svc»и затем он использует значение по умолчанию (т.е.basicHttpBinding) для этого, что создает несоответствие?

Да! В результате возникла проблема - несоответствие атрибута имени, указанного в моем файле .svc (разметка), и имени службы в моем файле web.config. Я видел исключения времени выполнения, потому что моя конфигурация иногда была недействительной - но это не означало, что она фактически была сопоставлена с конфигурацией! Stefan Mohr
0

Пожалуйста, проверьте эту ссылкуКак настроить службу WCF для взаимодействия с клиентами веб-службы ASP.NET .

To configure a Windows Communication Foundation (WCF) service endpoint to be interoperable with ASP.NET Web service clients, use the System.ServiceModel.BasicHttpBinding type as the binding type for your service endpoint.

Кроме того, определяя две конечные точки, вы можете использовать HTTP и HTTPS версии одного и того же сервиса.

1

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

Похожие вопросы