.NET 4 WCF SOAP-сервис HTTP POST возвращает 404 не найден - PullRequest
7 голосов
/ 10 июля 2011

У меня есть служба SOAP, размещенная в WCF, которую я могу использовать как из браузера, так и из моего SOAP-клиента в порядке при выполнении запросов HTTP GET, однако при выполнении любых запросов HTTP POST ответом является 404 Not Found.

Мой Web.config выглядит так:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    <bindings>
        <wsHttpBinding>
            <binding>
                <security mode="Transport">
                    <transport clientCredentialType="Certificate" />
                </security>
                <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding>
                <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </binding>
        </basicHttpBinding>
    </bindings>
</system.serviceModel>

Мой сервис определен в разметке с использованием файла .svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Boca.WebServices.Billing.QBService" CodeBehind="QBService.svc.cs" %>

Опять же, я могу запустить свой сервис с помощью браузера и SOAP-клиента следующим образом, используя HTTP GET, но не с HTTP POST:

Что я делаю не так? Разве я не должен использовать разметку .svc и просто определить свой сервис в Web.config?

UPDATE:

Когда я "запускаю отладку" своего проекта WCF из VS 2010 с помощью IIS Express на порт localhost: 8181, HTTP ЗАДАВАЕТСЯ к службе. Только когда служба размещается через IIS, HTTP POST к службе отклоняется или не обнаруживается.

Ответы [ 2 ]

9 голосов
/ 15 июля 2011

Я решил проблему. В конце концов, это была не проблема IIS, а проблема, связанная с тем, что я не настраивал <basicHttpBinding> с <security> узлом. Я не очень подробно читал о привязках и о том, как они работают, поэтому я подумал, что добавление <wsHttpBinding> вместе с <basicHttpBinding> добавит поддержку SSL для WCF.

Выполнение этого и настройка по умолчанию <wsHttpBinding> с узлом <security> определенно позволили мне получить метаданные SOAP безопасно, хотя внутренне он все еще использовал <basicHttpBinding>, однако POST не поддерживались.

Я обновил свою конфигурацию, чтобы transport clientCredentialType был установлен на None, и это решило проблему:

<bindings>
    <basicHttpBinding>
        <binding name="QBService_BasicHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="None" />
            </security>
            <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
    </basicHttpBinding>
</bindings>
2 голосов
/ 10 июля 2011

Если вы используете .NET 4, ваша служба будет прослушивать одну или несколько конечных точек с использованием basicHttpBinding - это значение по умолчанию, если вы не указываете конечную точку при использовании HTTP

Если у вас есть только одна службаконтракт, то ваш сервис будет прослушивать HTTP POST по адресу, оканчивающемуся на .svc.Если у вас есть более одного контракта на обслуживание, он размещает каждый контракт по адресу, подобному <path to .svc>/<serviceContractname>

. Служба ожидает запрос SOAP, поэтому вам потребуется POST XML-документ, соответствующий SOAP 1.1 (по умолчанию basicHttpBinding -этот).Самый простой способ добиться этого - создать прокси-сервер с использованием Add Service Reference в клиентском проекте и выполнить вызовы через сгенерированный прокси-класс - сантехника WCF сгенерирует соответствующее сообщение и отправит его службе

...