使用Http和Https进行WebHttpBinding

时间:2016-04-12 15:41:24

标签: c# asp.net web-services wcf webhttpbinding

我正在尝试使用https& http为网站。该网站有.svc文件,它们充当REST服务并从JavaScript调用。

我的配置:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehaviour">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>         
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>      
      <webHttpBinding>
        <binding name="httpsWebBinding">
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
        <binding name="httpWebBinding">
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>   
  </system.serviceModel>

浏览https://myserver/services/Lookups.svc/Hello给出了

找不到与绑定WebHttpBinding的端点的scheme http匹配的基址。已注册的基地址方案为[https]

浏览http://myserver/services/Lookups.svc/Hello给出了

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

如果我删除任何一个端点,它的工作原理。使用bindingConfiguration="httpWebBinding"配置的删除端点的示例适用于HTTPS,

如何使其与HTTP和HTTPS一起使用?截至目前,我可以通过删除一个端点来使用http或https。

推荐How can I combine the WCF services config for both http and https in one web.config?How do you setup HTTP and HTTPS WCF 4 RESTful services?

  

注意:在IIS中,有两个网站,一个在http上侦听,另一个在上面   HTTPS。两者在物理文件夹中共享相同的代码

更新:截至目前,我删除了端点并且可以正常工作。但我担心的是删除使用behaviourConfiguration配置的endpoing对我来说不是很好的解决方案。

这适用于http和&amp; HTTPS

  <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">

      </service>
    </services>

5 个答案:

答案 0 :(得分:5)

我重新创建了您的方案,并使用您的web.config为我的测试服务配置端点。您的配置正常并且工作正常。不适合您的部分可能是您在IIS中的https配置。确保您已启用https访问您的服务。如果您使用Visual Studio中的IISExpress进行测试,则左键单击您的项目,然后在属性窗口(View - &gt; Properties Window)中选择SSL Enabled = True。

答案 1 :(得分:0)

@Lesmian在他的回答中指出,问题出在你的IIS配置中。 更具体地说:

  

注意:在IIS中,有两个网站在http上侦听,另一个在https上侦听。两者在物理文件夹中共享相同的代码

原因是IIS无法处理它不支持的架构上的端点。

您有两个站点,其中一个具有HTTP绑定但没有HTTPS,另一个具有HTTPS但不具有HTTP。

因此,当您浏览到 http:// URL时,IIS会将您定向到(惊喜!)启用http的站点,读取web.config,看到它注册 https 端点(网站不支持)并抛出异常,告知 http - 仅启用网站上没有 https 方案支持。

当您浏览到 https:// 网址时情况类似 - IIS不允许您在 https http 端点> -enabled-only site。

要处理此问题,最好使用具有两个绑定的单个网站。

另一个(也是更复杂的)选项是为站点使用不同的web.configs:设置单独的站点(指向单独的文件夹)并使用Visual Studio的发布和web.config转换工具

答案 2 :(得分:0)

如果您更新端点配置,请执行以下操作:

        <endpoint address="http://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="https://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>

我用prod系统做了类似的舞蹈,这是我的解决方案。希望它也适合你。

答案 3 :(得分:0)

添加此代码。

<protocolMapping>
  <add scheme="http"  binding="webHttpBinding" bindingConfiguration="httpWebBinding"/>
  <add scheme="https" binding="webHttpBinding" bindingConfiguration="httpsWebBinding"/>
</protocolMapping>

答案 4 :(得分:-1)

我不知道此查询是否仍处于活动状态,但正如我检查的那样,请

还要添加binding="mexHttpsBinding" binding="mexHttpBinding"与不同的端点

这对我有帮助。