WCF service not working when accessed over HTTPS and HTTP
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
Adam
Updated on November 21, 2020Comments
-
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
- Webservice over SSL endpoint not found with 404
- create asp.net webservice for SSL HTTPS
- Moved my ASP.NET website to IIS 8 on windows server 2012... services missing: .svc files are viewable, but their methods give a 404
But renaming
webHttpBinding
tobasicHttpBinding
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;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. ---&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 over 9 yearsYou might need to change binding to webHttpsBinding for communication over https channel.
-
Adam over 9 yearsBut 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 over 9 yearsThis probably doesn't help you immediately but I guarantee you the answer is in amazon.com/Programming-WCF-Services-Mastering-AppFabric/dp/…
-
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 over 9 years@JenishRabadiya I tried adding
<webHttpsBinding></webHttpsBinding>
to mybindings
node, but it's unrecognized in my web.config. Could you give an example of what and where to add this? -
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 over 9 yearsYou may want to check a few things: ensure that the port is open using
netstat
; ensure the certificate has been bound to your servicenetsh http show sslcert
. Also, the first few lines of the trace file, after a fresh service start, should indicate which endpoints are established -
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 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 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 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 inhttp
-port 80, if you have configured forhttps
. I am not sure which tool i need to suggest to check port forwarding, however, i am searching that. -
Arindam Nayak over 9 years@Flo , i am finally able to crack this out, please take a look at my answer.
-
Adam over 9 yearsSorry, that was not updated in my post yet, but I already had the security mode enabled. See updated post.
-
Adam over 9 yearsPerfect! Thank you so much! :-D
-
Adam over 9 yearsOne 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 over 9 years@Flo, I have answered this type of question many time, please find one of them here stackoverflow.com/questions/25889599/…
-
Adam over 9 yearsOk 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 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 over 8 yearsThank you, came across this post, and it solved my problem :).
-
EpicJoker almost 8 years@ArindamNayak Well played sir. This worked for me seamlessly.
-
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 almost 8 yearsThank you @MGOwen, not exacally the same issue as OP but solved mine: serverfault.com/questions/776390/…
-
Lzh over 7 yearsI 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?