WCF绑定到HTTPS

时间:2013-01-30 18:50:18

标签: wcf .net-3.5

据我所知,有很多关于此的帖子,我已经浏览了所有搜索结果,并实现了所提到的所有内容。我有一个WCF Web服务,可以在我的本地系统上使用HTTP,它可以在HTTP上的服务器上运行。但客户端要求通过HTTPS工作。这个站点和其他站点上的帖子的镜像表明,这并不像应该的那样直截了当,因为在此之前,ASMX Web服务“只是工作”并且不需要复杂的配置。

我的当前配置出现以下错误:

  

无法找到与方案https匹配的基地址   绑定WSHttpBinding的端点。注册的基地址方案   是[http]。

这是我这段时间的代码,经过几天的努力来配置这项工作无济于事:

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

我做错了什么,如何让它通过HTTPS工作?我很沮丧,这不是应该的那么简单。我已经在MSDN的WCF文档中埋葬了这个项目的几个月,并且很好地掌握了服务,端点和绑定 - 足以让我感到沮丧甚至比我根本不知道的更多。

更新:还在努力,我在尝试为mex地址填写完整的URL时出现了一个奇怪的错误。我改变了这个:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

并收到错误:

  

此服务的安全设置需要Windows身份验证,但是   它未为承载此服务的IIS应用程序启用。

我没有尝试使用Windows身份验证,安全设置未更改,仍设置为

  

&lt; security mode =“Transport”/&gt;

Could not find a base address that matches scheme https for the endpoint with binding WebHttpBinding. Registered base address schemes are [http]   - 没有帮助,没有提到会有所帮助 Could not find a base address that matches scheme http for the endpoint with binding WSHttpBinding   - 我正在使用运输安全,这不适用。尝试改变到不同的安全模式,仍然无法让网站工作。

4 个答案:

答案 0 :(得分:3)

multipleSiteBindingsEnabled="true"添加到serviceHostingEnvironment并更新安全性以禁用客户端凭据:

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

修改 我在Windows 2003下的最终工作版本使用以下配置。

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

您可以使用https访问该网站,因此我猜安装的证书部分是正确的。如果您有任何想要与我的设置进行比较的内容,请与我们联系。

答案 1 :(得分:3)

您使用的是错误的HTTPS绑定。

有两个单独的绑定类。 wsHttpBinding和wsHttpsBinding注意到s。 您需要在绑定下为HTTPS添加wsHttpsBinding,并且您需要为该绑定提供新的端点。

此外,您看到的特定错误通常我会看到是否尚未从该位置为https设置IIS。

  • 打开IIS管理器
  • 开放网站
  • 右键单击“默认网站”。
  • 编辑绑定
  • 确保有https和http。
  • 的条目

  • 打开IIS管理器
  • 找到你的应用程序(我认为它将成为默认网站)。
  • 右键单击
  • 管理网站/应用程序
  • 高级设置
  • 启用协议
  • HTTP,HTTPS

答案 2 :(得分:2)

我用过这个,它对我有用,也许它可以帮到你

要在WCF WsHttp绑定上启用Https,可以在web.config文件中更改一些简单的步骤。

这些步骤是:

在服务的web.config文件中启用传输级别安全性:

在此步骤中,您需要将安全模式从none更改为Transport。下面的代码显示了如何执行此操作:

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

绑定绑定并指定HTTPS配置

您现在需要将绑定(预览步骤)与结束点相关联。使用bindingConfiguration标记指定绑定名称。您还需要指定托管服务的地址。下面的代码显示了如何做到这一点

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

。 您还需要在serviceMetaData中将httpGetEnabled更改为httpsGetEnabled。下面的代码展示了你如何做到:

<serviceMetadata httpsGetEnabled="true"/> 

希望有所帮助

答案 3 :(得分:0)

我在3.5设置中使用了您的确切配置,并使用Transport模式使用clientCredentialType="None"模式,如下面Luuk的回答中所述。但是,为了确定,我继续创建了一个示例项目,以模拟您从此处的信息中收集到的环境。

要模拟您的环境,我将IIS(7.5)设置为使用标准Asp.Net 2.0 Integrated应用程序池。我添加了3个http绑定和3个https绑定,以模拟“每个方案问题只能有一个地址”,baseAddressPrefixFilters可以使用它。

我只对mysite.com localhost进行了搜索和替换。下面是我用来制作屏幕截图的精确配置的复制粘贴:

<强>的web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

结果如下:

Screenshot

您会注意到WebPostService.svcmex个完整网址中出现两次httpsGetUrl。您需要将mex删除为仅WebPostService.svc/mex而不是{{1}}(或完全删除它,并且它仍能在我身边正常工作)

如果你想讨论这个或者除了IIS版本之外我们的环境之间有什么不同,我几乎整天都在WPF聊天室(另外5-6小时)。