Служба WCF, использующая basicHttpBinding, все еще отправляет тип содержимого "text / xml" - PullRequest
6 голосов
/ 11 ноября 2011

Я пишу службу WCF, работающую на IIS, и у меня есть клиент, чей клиент может использовать только SOAP 1.1.

Помимо прочего, им нужен тип контента "application / soap + xml; charset = utf-8". Мой сервис WCF отправляет "text / xml; charset = utf-8".

Клиент, который пытается написать клиент, отправил мне сообщение об ошибке:

HTTP 415: невозможно обработать сообщение, так как тип содержимого «Текст / XML; charset = utf-8 'не был ожидаемым типом «Приложения / мыло + XML; кодировка = UTF-8

Просматривая сеть, я нашел несколько страниц блога, таких как: Ошибка WCF - запрос не выполнен с HTTP-статусом 415 .

Что заставило меня подумать, что переключение с wsHttpBinding на basicHttpBinding исправит это. Поэтому я изменил привязку в web.config и изменил свой собственный тестовый клиент, чтобы явно создать конечную точку с BasicHttpBinding. И все это работало нормально в моих собственных тестах (как запуск службы в Dev Server Visual Studio, так и запуск ее в IIS7 на моей собственной машине, а также запуск в IIS6 на одном из наших тестовых серверов.)

Но прежде чем я поднял голову у клиента и попросил его посмотреть, сработают ли мои изменения, я запустил Fiddler, чтобы подслушать реальный трафик.

И, по словам Фиддлера, я все еще отправляю "text / xml; charset = utf-8".

Итак, как мне это исправить?

<system.serviceModel>
    <services>
        <service behaviorConfiguration="myBehavior" name="myName">
            <endpoint 
                    address=""
                    binding="basicHttpBinding" 
                    behaviorConfiguration="flatWsdlFileEndpointBehavior" 
                    bindingNamespace="http://myNamespace"
                    contract="myContract">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="myBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="flatWsdlFileEndpointBehavior">
                <wsdlExtensions location="myUrl" singleFile="true" />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
        <basicHttpBinding>
        </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <extensions>
        <behaviorExtensions>
            <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </behaviorExtensions>
    </extensions>
</system.serviceModel>

1 Ответ

13 голосов
/ 11 ноября 2011

Так им нужен SOAP 1.1 или application/soap+xml; charset=utf-8? Поскольку в спецификации SOAP 1.1 указано, что в запросе должен быть указан тип text/xml. application/soap+xml - это тип носителя для SOAP 1.2. Принуждение WCF к использованию SOAP 1.1 с application/soap+xml (= недопустимый SOAP) потребовало бы больших изменений, чем изменение привязки. Вам понадобится специальный кодировщик сообщений или, возможно, транспортный канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...