通过HTTPS和HTTP访问时,WCF服务无法正常工作

Flo*_*Flo 11 vb.net asp.net ssl wcf web-services

我在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/
Run Code Online (Sandbox Code Playgroud)

我也在这里查了一下

但是重命名webHttpBindingbasicHttpBinding与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>
Run Code Online (Sandbox Code Playgroud)

我检查了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>
Run Code Online (Sandbox Code Playgroud)

当我查看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> 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,服务定义为:

    <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
Run Code Online (Sandbox Code Playgroud)

我的网络服务

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

        'my code
    End Class
End Namespace   
Run Code Online (Sandbox Code Playgroud)

我也在我的web.config中启用了跟踪,这是日志的一部分(SO不允许全部发布):

<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
Run Code Online (Sandbox Code Playgroud)

我希望通过http和https提供此服务.

我还检查了我的web.config和global.asax.vb,但我没有专门针对https请求做任何事情,也没有在IIS中做什么......这个问题是什么?

UPDATE

好的,删除了一些端点,现在试图弄清楚在端点的地址值下提供什么.使用下面的配置我得到错误: 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>
Run Code Online (Sandbox Code Playgroud)

MGO*_*wen 14

这些Web服务对于您是使用HTTP还是HTTPS来访问它们都非常敏感.

尝试使用它为web.config中的WCF服务启用SSL:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding>
                <security mode="Transport" />
Run Code Online (Sandbox Code Playgroud)

我刚遇到类似的问题,请参阅我对这个问题的回答以获取更多信息:将我的ASP.NET网站移动到Windows Server 2012上的IIS 8 ...缺少服务:.svc文件是可见的,但是他们的方法给出了404

  • @MGOwen OP帮助我将WSDL显示为https,但是你解决了我抛出404的方法问题.谢谢! (2认同)

Ari*_*yak 13

@Flo,最后我能够让它发挥作用.我已经更新<endpoint behaviorConfiguration ..并设置<service behaviorConfiguration=..,并且它有效,我的意思是当你同时击中它们httphttps版本时 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>
Run Code Online (Sandbox Code Playgroud)