在同一服务上启用http和https

时间:2014-08-23 14:58:55

标签: c# wcf soap

我正在写一个包含单一合同的WCF服务。我希望Web客户端使用http或https来调用服务端点。

我的web.config如下:

(为简洁起见,部分部分已被删除)

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IDataService" />
        <binding name="BasicHttpsBinding_IDataService" >
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="DataServiceMetadataBehavior" name="DummyService.DataService">

        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataService"
          contract="DummyService.IDataService"/>

        <endpoint address=""
                 binding="basicHttpBinding" bindingConfiguration="BasicHttpsBinding_IDataService"
                 contract="DummyService.IDataService" name="BasicHttpsBinding_IDataService" 
                  />

      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DataServiceMetadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" />
      <add scheme="https" binding="basicHttpBinding" />

    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>

当我尝试使用VisualStudio测试客户端测试服务时,它会出现以下错误:

  

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

只有一个端点,一切正常。

1 个答案:

答案 0 :(得分:0)

端点由地址,绑定和合同组成。 http://YourBaseAddress/YourApp/YourService.svchttpS://YourBaseAddress/YourApp/YourService.svc是不同的地址,具有不同的模式名称或协议以及不同的端口:默认情况下为80和443,因此您可以为服务设置两个端点,使用相同的basicHttpBinding,前提是https one具有用于SSL传输的bindingConfiguration,就像您所做的那样。错误消息非常有用,因此您需要转到IIS(或IIS Express)以确保有一个http侦听器,例如在检查网站的“编辑绑定”功能后定义的https绑定。完成后,您应该能够在Web浏览器中通过httpS://YourBaseAddress/YourApp/YourService.svc?wsdl获取WSDL。

事实上,许多来自Microsoft和Google的Web服务/应用程序都通过相同的主机名和路径支持http和https。