通過 HTTPS 和 HTTP 訪問時,WCF 服務不工作
我在 IIS 中安裝了 SSL 證書。
現在,當我導航到我的域https://www.example.com/時,頁面載入正確。但是,當我嘗試通過 https: https ://www.example.com/service.svc/newprofile/?id=8&ipaddress= 124.162.13.109 訪問 Web 服務(通常通過 http 完美執行)時,我得到:
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/我也檢查了here
- 404 未找到基於 SSL 端點的 Web 服務
- 為 SSL HTTPS 創建 asp.net 網路服務
- 將我的 ASP.NET 網站移至 Windows Server 2012 上的 IIS 8 …服務失去:.svc 文件是可見的,但他們的方法給出了 404
但是重命名
webHttpBinding為basicHttpBinding結合 jsonp 會引發不受支持的錯誤。此外,web.config 中的服務元素名稱與實現我的契約的類的完全限定名稱相匹配。這是我的 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>我檢查了 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>當我檢查 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>本例中的服務定義為:
<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我的網路服務
Namespace RestService <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _ Public Class service Implements Iservice 'my code End Class End Namespace我也在我的 web.config 中啟用了跟踪,這是日誌的一部分(所以不允許全部發布):
<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我希望這項服務可以通過 http 和 https 使用。
我還檢查了我的 web.config 和 global.asax.vb,但我沒有專門針對 https 請求做任何事情,也沒有在 IIS 中……這個問題是什麼?
更新
好的,刪除了一些端點,現在試圖找出在端點的地址值下提供什麼。使用下面的這個配置,我得到了錯誤:
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>
@Flo,最後我能夠讓它工作。我已經更新
<endpoint behaviorConfiguration ..並設置<service behaviorConfiguration=..了,它起作用了,我的意思是當你同時點擊http和https版本時www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109,它會給你正確的輸出。以下是system.serviceModel部分web.config。請試試這個,讓我知道,如果你仍然無法使它工作。<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>
這類 Web 服務可能對您使用 HTTP 還是 HTTPS 訪問它們非常敏感。
嘗試使用它在 web.config 中為 WCF 服務啟用 SSL:
<system.serviceModel> <bindings> <webHttpBinding> <binding> <security mode="Transport" />我剛剛遇到了類似的問題,請參閱我對這個問題的回答以獲取更多資訊:Moved my ASP.NET website to IIS 8 on windows server 2012… services missing: .svc files are view, but their methods give a 404