WCF service not working when accessed over HTTPS and HTTP

36,779

Solution 1

@Flo, Finally I am able to make it work. I have updated <endpoint behaviorConfiguration .. and set <service behaviorConfiguration=.., and it worked, i mean when you hit both http and https version of www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109, it will get you correct output. Following is the system.serviceModel part of web.config. Please try this, let me know, if you are still not able to make it work.

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  <bindings>
    <webHttpBinding>
      <binding name="Binding" crossDomainScriptAccessEnabled="true">
        <security mode="Transport">
          <transport clientCredentialType="None" />
        </security>
      </binding>
      <binding name="httpbind" crossDomainScriptAccessEnabled="true">
      </binding>
    </webHttpBinding>
  </bindings>
  <client />
  <services>
    <service name="RestService.service"  behaviorConfiguration="ServiceBehaviour">
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="Binding" contract="RestService.Iservice" behaviorConfiguration="web">
      </endpoint>
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="httpbind" contract="RestService.Iservice" behaviorConfiguration="web">
      </endpoint>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehaviour">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
      <behavior name="web">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="web">
        <webHttp helpEnabled="true" />
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

Solution 2

These kind of web services can be super sensitive to whether you're using HTTP or HTTPS to access them.

Try using this to enable SSL for WCF services in the web.config:

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

I just had a similar problem, see my answer to this question for more info: Moved my ASP.NET website to IIS 8 on windows server 2012... services missing: .svc files are viewable, but their methods give a 404

Share:
36,779
Adam
Author by

Adam

Updated on November 21, 2020

Comments

  • Adam
    Adam over 3 years

    I've installed a SSL certificate in IIS.

    Now when I navigate to my domain https://www.example.com/ the page loads correctlty. But when I try to approach a web service (which normally works perfect over http) over https: https://www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109 I get:

    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/
    

    I also checked here

    But renaming webHttpBinding to basicHttpBinding throws an unsupported error in combination with jsonp. Also the service element name in the web.config matches the fully qualified named of the class that implements my contract.

    Here's my 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>
    

    I checked the wsdl: 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>
    

    When I check over 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> 
    

    The service in this case is defined as:

        <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
    

    My webservice

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

    I enabled tracing in my web.config as well, here's part of the log (SO does not allow to post it all):

    <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 want this service to be available over both http and https.

    I also checked my web.config and global.asax.vb, but I'm not doing anything specifically to https requests, also not in IIS...what can this issue be?

    UPDATE

    Ok, removed some endpoints and now trying to figure out what to provide under address value of the endpoint. With this config below I get the error: 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>
    
    • Jenish Rabadiya
      Jenish Rabadiya over 9 years
      You might need to change binding to webHttpsBinding for communication over https channel.
    • Adam
      Adam over 9 years
      But then all my services won't be available over http right? I want the services to be available on both http AND https.
    • Chris Marisic
      Chris Marisic over 9 years
      This probably doesn't help you immediately but I guarantee you the answer is in amazon.com/Programming-WCF-Services-Mastering-AppFabric/dp/…
    • Jenish Rabadiya
      Jenish Rabadiya over 9 years
      @Flo If you want then you can always keep old endpoint as it is and add new one with webHttpsBinding for https. look at link stackoverflow.com/questions/26248759/…
    • Adam
      Adam over 9 years
      @JenishRabadiya I tried adding <webHttpsBinding></webHttpsBinding> to my bindings node, but it's unrecognized in my web.config. Could you give an example of what and where to add this?
    • Jenish Rabadiya
      Jenish Rabadiya over 9 years
      @Flo I have provided link in above comment that question contains the example of service which communicates on two different endpoint (communication medium) one is SOAP and another is REST. link : stackoverflow.com/questions/26248759/…
    • Seymour
      Seymour over 9 years
      You may want to check a few things: ensure that the port is open using netstat; ensure the certificate has been bound to your service netsh http show sslcert. Also, the first few lines of the trace file, after a fresh service start, should indicate which endpoints are established
    • Adam
      Adam over 9 years
      @JenishRabadiya: I did look at that link, but I don't see how to add https endpoint there. What to provide under address property of my service? (I updated my post) @Seymour: but I can already approach my www site over https so port should be open right? I checked the traced log file and it listens on 'http://<pcname>/service.svc'
    • Arindam Nayak
      Arindam Nayak over 9 years
      @Flo, have you checked if there is port forwarding enabled, i.e. redirect 443 port to 80 port at firewall level - social.msdn.microsoft.com/Forums/vstudio/en-US/…
    • Adam
      Adam over 9 years
      @ArindamNayak: If that were the case I think I should also be unable to navigate to example.com right? But that page loads correctly. If you think the firewall could still be an issue, which rule in the Firewall should I remove?
    • Arindam Nayak
      Arindam Nayak over 9 years
      @Flo, i was saying if that is true , it will make you redirect from HTTPS to HTTP, and WCF is very sensitive to this, even though .svc works in both, actual method execution will not working in http-port 80, if you have configured for https. I am not sure which tool i need to suggest to check port forwarding, however, i am searching that.
    • Arindam Nayak
      Arindam Nayak over 9 years
      @Flo , i am finally able to crack this out, please take a look at my answer.
  • Adam
    Adam over 9 years
    Sorry, that was not updated in my post yet, but I already had the security mode enabled. See updated post.
  • Adam
    Adam over 9 years
    Perfect! Thank you so much! :-D
  • Adam
    Adam over 9 years
    One more question: it now seems that when I'm logged into my site I can't call these services anymore. I'm getting error: Cross domain javascript callback is not supported in authenticated services.. Any idea what that could be? Please note: I MUST have these services available cross-domain.
  • Arindam Nayak
    Arindam Nayak over 9 years
    @Flo, I have answered this type of question many time, please find one of them here stackoverflow.com/questions/25889599/…
  • Adam
    Adam over 9 years
    Ok thanks again, I'll have a look at it. But before I start implementing everything could you tell if your solution supports the following: 1. access my webservices over both http and https? 2. call my webservices cross domain? 3. call my webservices cross domain even when authenticated (via Forms Authentication)? Thanks!
  • Arindam Nayak
    Arindam Nayak over 9 years
    @Flo, 1. Supporting http, https is just config based, so that will definitely work. 2. To handle POST request you have to follow the link which I had given, not sure why GET request did not work there. 3. I don't think it would be issue with CORS.
  • Fred
    Fred over 8 years
    Thank you, came across this post, and it solved my problem :).
  • EpicJoker
    EpicJoker almost 8 years
    @ArindamNayak Well played sir. This worked for me seamlessly.
  • EpicJoker
    EpicJoker almost 8 years
    @MGOwen OP helped me with the WSDL not showing as https, but you solved my issue of methods throwing 404. Thank you!!
  • Morvael
    Morvael almost 8 years
    Thank you @MGOwen, not exacally the same issue as OP but solved mine: serverfault.com/questions/776390/…
  • Lzh
    Lzh over 7 years
    I think there is something wrong here even if it works: The configuration for <code>service name="RestService.service"</code> has two endpoints that have the same binding and same address (and just different binding configuration...) How will this work? How will the WCF runtime know when a request comes to that address via that binding which config to apply?