HTTP和HTTPS绑定

时间:2012-11-28 15:34:47

标签: c# .net wcf wcf-binding

我有一个使用WCF Web服务的应用程序。

我将它配置为使用https绑定。它工作正常。我还想添加一个HTTP绑定。

我的要求是,如果我的客户端在我的域(或VPN)上,我需要他们使用HTTP绑定。如果它们是外部客户端,我希望它们使用HTTPS绑定。我怎么能这样做呢?我是WCF的新手,这是我第一次尝试它。

我已附上我的配置文件以供参考。我不知道在哪里添加HTTP绑定的终点。任何帮助都会得到满足。

<system.serviceModel>
    <services>
      <service name="{service name}"
                behaviorConfiguration="httpsBehavior">
        <!--HTTPS END POINT-->
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="SecureHTTPBinding"
                  contract="{service contract}" />

    <!--METADATA ENDPOINT--> 
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange" />
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="httpsBehavior">
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl="" />
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>

    <behavior name="httpBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>

  </serviceBehaviors>
</behaviors>

<bindings>
  <basicHttpBinding>
    <!--HTTPS BINDING-->
    <binding name="SecureHTTPBinding">
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>

    <!--HTTP BINDING-->
    <binding name="BasicHttpBinding">
      <security mode="None" />
    </binding>

  </basicHttpBinding>
</bindings>

编辑:添加netTCP绑定

<system.serviceModel>
    <services>
      <service name="{Service Name}"
                behaviorConfiguration="httpsBehavior">
        <!--HTTPS END POINT-->
        <endpoint address="https://localhost/Service1.svc"
                  binding="basicHttpBinding"
                  bindingConfiguration="SecureHTTPBinding"
                  contract="{Service Contract}"  name="httpsEndPoint"/>

    <!--METADATA ENDPOINT--> 
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange" />

    <!--HTTP END POINT-->
    <endpoint address="http://localhost/Service1.svc"
              binding="basicHttpBinding"
              bindingConfiguration="HttpBinding"
              contract="{Service Contract}" name="httpsEndPoint"/>

    <!--TCP METATADATA END POINT-->
    <endpoint address="mextcp" binding="mexTcpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:808/Service1.svc" />
      </baseAddresses>
    </host>

    <!--TCP ENDPOIN-->
    <endpoint address="net.tcp://localhost:808/Service1.svc" binding="netTcpBinding" contract="{Service Contract}" name="netTCPEndPoint" />



  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="httpsBehavior">
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl="" />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>

  </serviceBehaviors>
</behaviors>

<bindings>
  <basicHttpBinding>
    <!--HTTPS BINDING-->
    <binding name="SecureHTTPBinding" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>

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

    <!--HTTP BINDING-->
    <binding name="HttpBinding" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
      <security mode="None" />
    </binding>

  </basicHttpBinding>

  <!--TCP BINDING-->
  <netTcpBinding>
    <binding transferMode="Buffered" />
  </netTcpBinding>

</bindings>

我知道可能会对代码中的数字进行Dos攻击,我会解决它。现在只是想让它运作起来。当我使用这个配置文件时,我遇到了错误,说

无法找到与端点MetadataExchageTcpBinding的方案net.tcp匹配的基址。注册的基地址为[http,https]

有人可以帮助我为我的服务公开net.tcp绑定。 任何帮助都是适当的

1 个答案:

答案 0 :(得分:1)

对您的域客户端使用netTcpBinding。您的网络防火墙几乎肯定会在允许HTTP流量的同时阻止原始TCP流量,因此它自然会确保每个客户端都转到相应的端点。你可以很好地为域名客户提供额外的性能提升。

如果您不想这样做(例如您的WCF主机不支持它,或者您遇到VPN客户端问题),那么只需为所有客户端公开一个HTTPS端点,而不管其位置如何。与首先进行跨网络呼叫的开销相比,SSL的成本将是微不足道的。

<强>背景

  • netTcpBinding以紧凑的二进制格式传输数据,这比通过HTTP发送XML文本更有效。缺点是:它与非.NET客户端不兼容,您必须打开防火墙上的特定端口才能通过。但是,这些问题都不会成为您的方案的问题。
  • 您可以在WCF服务中公开任意数量的端点,只要它们都具有唯一的不同的Address / Binding / Contract组合。因此,您可以将HTTPS和TCP端点都暴露给同一服务,因为它们将具有不同的地址和绑定。