IIS 7.5 Wcf https WSDL всегда возвращает пустой (неверный запрос)

Все остальное отлично работает, я могу сделать вызовы SOAP и RESTful без проблем через https. Но WSDL всегда возвращает пустой (плохой запрос). HTTP возвращает результат WSDL.

Отчеты внутреннего исключения журнала трассировки:

The body of the message cannot be read because it is empty.

Тег serviceMetaData установлен:

<serviceMetadata
httpGetEnabled="true"
policyVersion="Policy15"
httpsGetEnabled="true" />

web.Config разделы Переплет:

    <bindings>
        <basicHttpBinding>
            <binding name="soapBinding">
                <security mode="None">
                </security>
            </binding>
        </basicHttpBinding>
        <webHttpBinding>
            <binding name="webBinding">
                <security mode="None">
                </security>
            </binding>
        </webHttpBinding>
    </bindings>

Вы сразу же увидите режим безопасности = "Нет"

Через ServiceHostFactory Я вижу режим транспортировки как:

        ServiceHost serviceHost = new ServiceHost(service.GetType(), baseAddresses);

        if (ExposeSSL(baseAddresses[0]))
        {
            foreach (var endpoint in serviceHost.Description.Endpoints)
            {
                if (endpoint.Binding is WebHttpBinding)
                {
                    ((WebHttpBinding)endpoint.Binding).Security.Mode = WebHttpSecurityMode.Transport;
                    endpoint.Address = new EndpointAddress(baseAddresses[0].ToString().Replace("http", "https"));
                }
                if (endpoint.Binding is BasicHttpBinding)
                {
                    ((BasicHttpBinding)endpoint.Binding).Security.Mode = BasicHttpSecurityMode.Transport;
                    endpoint.Address = new EndpointAddress(baseAddresses[0].ToString().Replace("http", "https"));
                }
            }

Конфигурация служб:

        <service name="xxxx.Wcf.AdminJsonService" behaviorConfiguration="DefaultBehaviour">
            <host>
                <baseAddresses>
                    <!-- note, choose an available port-->
                    <add baseAddress="http://localhost:62701/json"/>
                </baseAddresses>
            </host>
            <!-- Service Endpoints -->
            <endpoint address="" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="jsonBehavior" bindingNamespace="https://www.xxxx/WebService4/AdminJsonService" contract="xxxx.Wcf.IAdminJsonService"/>
        </service>

        <service name="xxxx.Wcf.AdminXmlService" behaviorConfiguration="DefaultBehaviour">
            <host>
                <baseAddresses>
                    <!-- note, choose an available port-->
                    <add baseAddress="http://localhost:62701/xml"/>
                </baseAddresses>
            </host>
            <!-- Service Endpoints -->
            <endpoint address="" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="poxBehavior" bindingNamespace="https://www.xxx/WebService4/AdminXmlService" contract="xxxx.Wcf.IAdminXmlService"/>
        </service>

        <service name="xxxx.Wcf.AdminSoapService" behaviorConfiguration="DefaultBehaviour">
            <!-- Service Endpoints -->
            <endpoint binding="basicHttpBinding" behaviorConfiguration="soapBehavior" bindingNamespace="https://www.example.com/WebService4/AdminSoapService" contract="xxxx.Wcf.IAdminSoapService"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>

Поведение в конечных точках

            <!-- SOAP -->
            <behavior name="soapBehavior">
            </behavior>
            <!-- JSON -->
            <behavior name="jsonBehavior">
                <webHttp/>
            </behavior>
            <!-- POX -->
            <behavior name="poxBehavior">
                <webHttp/>
            </behavior>

Поведение обслуживания

            <behavior name="ErrorBehaviour">
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
            <behavior name="DefaultBehaviour">
                <NiceErrorHandler/>
                <!-- 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"/>

                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata
                    httpGetEnabled="true"
                    policyVersion="Policy15"
                    httpsGetEnabled="true" />
            </behavior>

Также есть

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>

У кого-нибудь есть идея, почему это может произойти?

Ответ 1

Вы пытались отключить одну из других конечных точек? В моем случае WCF не работал, пока я не отключил одну из конечных точек. Не важно, какой из них я отключил. Другие будут работать.

    <services>
      <service name="GTW.TrendToolService" behaviorConfiguration="MyServiceBehavior">
        <!--<endpoint name="rest" address="" binding="webHttpBinding" contract="TT.ITrendtoolService" behaviorConfiguration="restBehavior"/>-->
        <endpoint name="json" address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="GTW.IAqvService" />
        <endpoint name="xml" address="xml" binding="webHttpBinding" behaviorConfiguration="restBehavior" contract="GTW.IAqvService" />
        <!--<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="GTW.IAqvService" />
        <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="GTW.IAqvService" />-->
      </service>
    </services>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="restBehavior">
      <webHttp />
    </behavior>
    <behavior name="jsonBehavior">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
</behaviors>

Ответ 2

Я считаю, что ваша проблема будет связана с вашим разделом поведения службы. В частности, вы сказали .net опубликовать WSDL в HTTP, но не HTTPS. Попробуйте следующее

       <behavior name="DefaultBehaviour">
            <NiceErrorHandler/>
            <!-- 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"/>

            <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
            <serviceMetadata
                httpGetEnabled="true"
                httpsGetEnabled="true"
                policyVersion="Policy15"
                httpsGetEnabled="true" />
        </behavior>

Обратите внимание на дополнительную строку в serviceMetadata, ссылающуюся на httpsGet, а не на http.

Я предполагаю, что https включен как в привязках, так и в вашем приложении, учитывая, что вы можете видеть HTTP WSDL, а не какой-то mumbble jumbo о невозможности найти привязки или что-то в этом роде.

Ответ 3

Когда вы выполняете шифрование транспорта, вы должны добавить s в свой протокол базового адреса ex: < add baseAddress = "https://localhost: 62701/xml" / " > или < добавить baseAddress =" http://localhost: 62701/json "/" >