2014-10-25 12 views
7

Ich habe ein SSL-Zertifikat in IIS installiert.WCF-Dienst funktioniert nicht beim Zugriff über HTTPS und HTTP

Wenn ich nun zu meiner Domain https://www.example.com/ navigiere, wird die Seite korrekt geladen. Aber wenn ich versuche, einen Web-Service zu nähern (die in der Regel perfekt über http arbeitet) über https: https://www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109 ich:

The resource cannot be found. 

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /service.svc/newprofile/ 

ich auch

Aber das Umbenennen webHttpBinding zu basicHttpBinding löst einen nicht unterstützten Fehler in Kombination mit Jsonp aus. Auch der Name des Dienstelements in der Datei web.config stimmt mit dem vollständig qualifizierten Namen der Klasse überein, die meinen Vertrag implementiert.

Hier ist meine web.config

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
<bindings> 
    <webHttpBinding> 
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true">   
    </binding> 
    <binding name="webHttpsBindingWithJsonP" crossDomainScriptAccessEnabled="true"> 
     <security mode="Transport"></security> 
    </binding>   
    </webHttpBinding> 
</bindings> 
<client /> 
<services> 
    <service name="RestService.service"> 
    <endpoint behaviorConfiguration="webHttp" binding="webHttpBinding" contract="RestService.Iservice" /> 
    <endpoint address="/service.svc" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="RestService.Iservice" /> 
    <endpoint address="/service.svc" binding="webHttpBinding" bindingConfiguration="webHttpsBindingWithJsonP" contract="RestService.Iservice" /> 
    </service> 
</services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webHttp"> 
      <webHttp /> 
     </behavior> 
     <behavior name="webHttpBehavior"> 
      <webHttp /> 
     </behavior>   
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 

ich die WSDL-Datei geprüft: http://www.example.com/service.svc?wsdl

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="service" targetNamespace="http://tempuri.org/"> 
<wsdl:types> 
    <xsd:schema targetNamespace="http://tempuri.org/Imports"> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd0" namespace="http://tempuri.org/"/> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/RestService"/> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd3" namespace="http://schemas.microsoft.com/Message"/> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/AjaxControlToolkit"/> 
     <xsd:import schemaLocation="http://www.example.com/service.svc?xsd=xsd5" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
    </xsd:schema> 
</wsdl:types> 
<wsdl:message name="Iservice_newProfile_InputMessage"> 
    <wsdl:part name="parameters" element="tns:newProfile"/> 
</wsdl:message> 

Wenn ich überprüfen, über https: https://www.example.com/service.svc?wsdl

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="service" targetNamespace="http://tempuri.org/"> 
<wsdl:types> 
<xsd:schema targetNamespace="http://tempuri.org/Imports"> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd0" namespace="http://tempuri.org/"/> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/RestService"/> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd3" namespace="http://schemas.microsoft.com/Message"/> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/AjaxControlToolkit"/> 
<xsd:import schemaLocation="https://www.example.com/service.svc?xsd=xsd5" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
</xsd:schema> 
</wsdl:types> 
<wsdl:message name="Iservice_newProfile_InputMessage"> 
<wsdl:part name="parameters" element="tns:newProfile"/> 
</wsdl:message> 

Der Service in diesem Fall definiert ist, wie:

<OperationContract()> _ 
<Web.WebInvoke(Method:="GET", ResponseFormat:=Web.WebMessageFormat.Json, BodyStyle:=Web.WebMessageBodyStyle.Bare, _ 
     UriTemplate:="newprofile/?id={id}&ipaddress={ipaddress}")> _ 
     Function newProfile(ByVal Id As String, Optional ByVal IPAddress As String = "") As service.Profile 

Mein webservice

Namespace RestService 
    <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _ 
    Public Class service 
     Implements Iservice 

     'my code 
    End Class 
End Namespace 

ich aktivierter als auch in meinem web.config Tracing, hier ist Teil des log (SO nicht erlaubt, alles zu schreiben):

<E2ETraceEvent 
    xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System 
     xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <EventID>262155</EventID> 
     <Type>3</Type> 
     <SubType Name="Error">0</SubType> 
     <Level>2</Level> 
     <TimeCreated SystemTime="2014-10-27T19:07:08.0773174Z" /> 
     <Source Name="System.ServiceModel" /> 
     <Correlation ActivityID="{f7c83e1b-3e28-4e4f-8978-23f5073be422}" /> 
     <Execution ProcessName="w3wp" ProcessID="1428" ThreadID="19" /> 
     <Channel/> 
     <Computer>MYPC</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord 
        xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
        <TraceIdentifier>http://msdn.microsoft.com/nl-NL/library/System.ServiceModel.Channels.HttpChannelMessageReceiveFailed.aspx</TraceIdentifier> 
        <Description>Failed to lookup a channel to receive an incoming message. Either the endpoint or the SOAP action was not found.</Description> 
        <AppDomain>/LM/W3SVC/1/ROOT-2-130589104148009222</AppDomain> 
        <Source>System.ServiceModel.Activation.HostedHttpTransportManager/33997547</Source> 
        <ExtendedData 
         xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/StringTraceRecord"> 
         <IsRecycling>False</IsRecycling> 
        </ExtendedData> 
       </TraceRecord> 
      </DataItem> 
     </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent 
    xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System 
     xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <EventID>131074</EventID> 
     <Type>3</Type> 
     <SubType Name="Error">0</SubType> 
     <Level>2</Level> 
     <TimeCreated SystemTime="2014-10-27T19:07:08.0803197Z" /> 
     <Source Name="System.ServiceModel" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="w3wp" ProcessID="1428" ThreadID="19" /> 
     <Channel/> 
     <Computer>MYPC</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord 
        xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
        <TraceIdentifier>http://msdn.microsoft.com/nl-NL/library/System.ServiceModel.Diagnostics.EventLog.aspx</TraceIdentifier> 
        <Description>Wrote to the EventLog.</Description> 
        <AppDomain>/LM/W3SVC/1/ROOT-2-130589104148009222</AppDomain> 
        <ExtendedData 
         xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/DictionaryTraceRecord"> 
         <CategoryID.Name>EventLogCategory</CategoryID.Name> 
         <CategoryID.Value>5</CategoryID.Value> 
         <InstanceID.Name>EventId</InstanceID.Name> 
         <InstanceID.Value>3221356547</InstanceID.Value> 
         <Value0>System.ServiceModel.Activation.HostedHttpRequestAsyncResult/52951402</Value0> 
         <Value1>System.Web.HttpException (0x80004005): There was no channel actively listening at 'https://www.example.com/service.svc/newprofile/?id=8&amp;amp;ipaddress=25.62.133.109'. This is often caused by an incorrect address URI. Ensure that the address to which the message is sent matches an address on which a service is listening. ---&amp;gt; System.ServiceModel.EndpointNotFoundException: There w 

I möchte, dass dieser Dienst sowohl über http als auch über https verfügbar ist.

Ich habe auch meine web.config und global.asax.vb überprüft, aber ich mache nichts speziell auf https Anfragen, auch nicht in IIS ... was kann dieses Problem sein?

UPDATE

Ok, entfernt einige Endpunkte und nun versuchen, herauszufinden, was unter der Adresse Wert des Endpunkts zu liefern. Mit dieser Konfiguration unten erhalte ich die Fehlermeldung: The endpoint at 'http://<pcname>/service.svc' does not have a Binding with the None MessageVersion. 'System.ServiceModel.Description.WebHttpBehavior' is only intended for use with WebHttpBinding or similar bindings.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <bindings> 
     <webHttpBinding> 
     <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true"> 
      <security mode="Transport"></security> 
     </binding> 
     </webHttpBinding> 
     <wsHttpBinding> 
     <binding name="wsHttpBinding" > 
      <security mode="Transport">   
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client /> 
    <services> 
     <service name="RestService.service"> 

     <endpoint behaviorConfiguration="webHttp" binding="webHttpBinding" contract="RestService.Iservice" /> 

     <endpoint behaviorConfiguration="webHttp" binding="wsHttpBinding" contract="RestService.Iservice" /> 

     <!-- 
     <endpoint address="/service.svc" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="RestService.Iservice" /> 
--> 

     <!-- 
     <endpoint behaviorConfiguration="webHttp" binding="webHttpBinding" contract="RestService.Iservice" /> 
     <endpoint address="/service.svc" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="RestService.Iservice" /> 
--> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webHttp"> 
      <webHttp /> 
     </behavior> 
     <behavior name="webHttpBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

Möglicherweise müssen Sie die Bindung an webHttpsBinding für die Kommunikation über HTTPS-Kanal ändern. –

+0

Aber dann werden alle meine Dienste nicht über HTTP verfügbar sein, oder? Ich möchte, dass die Dienste sowohl auf http als auch auf https verfügbar sind. – Flo

+0

Dies hilft Ihnen wahrscheinlich nicht sofort, aber ich garantiere Ihnen die Antwort ist in http://www.amazon.com/Programming-WCF-Services-Mastering-AppFabric/dp/0596805489 –

Antwort

7

@Flo, schließlich bin ich der Lage, es funktioniert. Ich habe <endpoint behaviorConfiguration .. aktualisiert und <service behaviorConfiguration=.. eingestellt, und es hat funktioniert, ich meine, wenn Sie beide http und https Version von www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109 schlagen, wird es Ihnen korrekte Ausgabe erhalten. Folgendes ist der system.serviceModel Teil von web.config. Bitte versuchen Sie es, lassen Sie es mich wissen, wenn Sie es immer noch nicht schaffen.

+1

Perfekt! Ich danke dir sehr! :-D – Flo

+0

Eine weitere Frage: Es scheint nun, dass ich diese Dienste nicht mehr aufrufen kann, wenn ich bei meiner Website angemeldet bin. Ich erhalte einen Fehler: 'Cross-Domain Javascript Callback wird in authentifizierten Diensten nicht unterstützt.'Irgendeine Idee was das sein könnte? Bitte beachten Sie: Ich MUSS diese Dienste domänenübergreifend verfügbar haben. – Flo

+0

@Flo, ich habe diese Art von Frage viele Male beantwortet, finden Sie bitte eine von ihnen hier http://StackOverflow.com/Questions/25889599/WCF-rest-Service-Template-40Cs-Cross-Domain-Fehler –

11

Diese Art von Web-Services können super empfindlich sein, ob Sie über HTTP oder HTTPS auf sie zuzugreifen.

Verwenden Sie diese Option, um SSL für WCF-Dienste im Internet zu aktivieren.config:

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
      <binding> 
       <security mode="Transport" /> 

Ich hatte gerade ein ähnliches Problem, meine Antwort auf diese Frage für weitere Informationen siehe: Moved my ASP.NET website to IIS 8 on windows server 2012... services missing: .svc files are viewable, but their methods give a 404

+0

Sorry, das wurde in meinem Beitrag noch nicht aktualisiert, aber ich hatte bereits den Sicherheitsmodus aktiviert. Siehe aktualisierten Beitrag. – Flo

+1

Danke, stieß auf diesen Beitrag, und es löste mein Problem :). –

+1

@MGOwen OP half mir mit der WSDL nicht als https, aber Sie lösten mein Problem der Methoden werfen 404. Danke !! – EpicJoker

Verwandte Themen