2011-08-10 9 views
11

Cała reszta działa poprawnie, mogę tworzyć połączenia SOAP i RESTful bez problemu przez https. Ale WSDL zawsze zwraca puste (złe żądanie). HTTP zwraca WSDL dobrze.IIS 7.5 Wcf https WSDL zawsze zwraca puste (nieprawidłowe żądanie)

dziennika śledzenia wewnętrzne raporty wyjątków:

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

serviceMetaData znacznik jest ustawiony:

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

sekcje web.config Oprawa:

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

Będziesz natychmiast zauważy tryb zabezpieczeń = "Brak"

Via ServiceHostFactory widzę tryb transportu jak:

 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")); 
       } 
      } 

konfiguracji usługi:

 <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> 

Endpoint zachowań

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

serwisowe Zachowania

  <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> 

Również

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

Ktoś ma pomysł dlaczego to może mieć miejsce?

+0

Zrozumiałeś to? –

+1

Czy możesz wyświetlić adres URL żądania WSDL? –

+0

Zgadzam się na to pytanie, ponieważ pytający nie odpowiedział na te pytania w ciągu tygodnia! –

Odpowiedz

0

Czy próbowałeś wyłączyć jeden z pozostałych punktów końcowych? W moim przypadku WCF nie działało, dopóki nie wyłączyłem jednego z punktów końcowych. Nie miało znaczenia, które z nich wyłączyłem. Inni będą pracować.

<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> 
0

Wierzę, że Twój problem będzie związany z sekcją dotyczącą zachowań usług. W szczególności polecono .net, aby opublikować plik WSDL w protokole HTTP, ale nie w protokole HTTPS. Spróbuj wykonać następujące

 <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> 

zanotować dodatkową linię w serviceMetadata nawiązujący do httpsGet w przeciwieństwie do http.

będę zakładać, że HTTPS jest włączona na obu wiązań i w aplikacji podano, że można zobaczyć WSDL http zamiast trochę Mumble jumbo o nie mogąc znaleźć powiązania czy coś ...

0

kiedy robisz szyfrowanie transportu, musisz dodać s do swojego podstawowego adresu, np: < add baseAddress = "https: // localhost: 62701/xml" /> lub < add baseAddress = "http: // localhost: 62701/json "/>