通过 HTTPS 和 HTTP 访问时 WCF 服务不工作

问题描述 投票:0回答:4

我已在 IIS 中安装了 SSL 证书。

现在,当我导航到我的域时 https://www.example.com/ 页面加载正确。 但是,当我尝试通过 https 访问 Web 服务(通常通过 http 完美运行)时:https://www.example.com/service.svc/newprofile/?id=8&ipaddress=124.162.13.109 我得到:

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/

我也查过这里

但是将

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;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

我希望此服务可通过 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>
asp.net vb.net web-services wcf ssl
4个回答
19
投票

此类 Web 服务对于您使用 HTTP 还是 HTTPS 访问它们可能非常敏感。

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

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

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


16
投票

@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>

0
投票

经过大量的测试和尝试,我终于成功了。我的配置如下。

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <compilation targetFramework="4.5.2" debug="true"/>
    <httpRuntime targetFramework="4.5.2"/>
  </system.web>
    <system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  <bindings>
    <webHttpBinding>
      <binding name="Binding" crossDomainScriptAccessEnabled="true">
        <security mode="Transport">
          <transport clientCredentialType="None" />
        </security>
      </binding>
    </webHttpBinding>
  </bindings>
  <client />
  <services>
    <service name="yourservicename"  behaviorConfiguration="ServiceBehaviour">
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="Binding" contract="yourserviceIname" behaviorConfiguration="web">
      </endpoint>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehaviour">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="web">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>  
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="104857600"/>
      </requestFiltering>
    </security>
    <handlers>
      <add name=".svc" verb="*" path="*.svc" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </handlers>
  </system.webServer>
  <connectionStrings>
    <add name="SqlServerContext" providerName="System.Data.SqlClient" connectionString="Server=VMA10363C\SQLEXPRESS;Database=Inmobiliaria;Trusted_Connection=True;"/>
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>

就我而言,我在端口 8052 上运行 wcf 没有任何问题。 非常感谢,如果您有任何问题,我在这里!


0
投票

我通过在 web.config 中添加一个属性解决了这个问题( multipleSiteBindingsEnabled="true")

© www.soinside.com 2019 - 2024. All rights reserved.