WCF 服务上的多个绑定

Posted

技术标签:

【中文标题】WCF 服务上的多个绑定【英文标题】:Multiple Bindings on WCF Service 【发布时间】:2012-01-11 23:07:26 【问题描述】:

我想在 IIS 7.5 中托管 WCF 4.0 服务,并能够使用 basicHttpBinding 绑定到它,还可以使用 webHttpBinding 以 RESTful 方式绑定。

我需要能够像这样访问它:

http://server/wcf/service/method/parameters(休息)

也像这样:

http://server/wcf/service.svc(基本 HTTP)

到目前为止,我的 Web.config 有这个:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="json">
          <webHttp defaultOutgoingResponseFormat="Json" helpEnabled="true" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="SAIF.Services.WCF.Services.CustomerContactService">
        <endpoint address="CustomerContact" behaviorConfiguration="json" binding="webHttpBinding" contract="SAIF.Services.WCF.Contracts.ICustomerContactService" />
        <endpoint address="CustomerContact.svc" binding="basicHttpBinding" contract="SAIF.Services.WCF.Contracts.ICustomerContactService" />
      </service>
      <service name="SAIF.Services.WCF.Services.OnlineLoginService">
        <endpoint address="OnlineLogin" binding="basicHttpBinding" contract="SAIF.Services.WCF.Contracts.IOnlineLoginService" />
      </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
      <serviceActivations>
        <add relativeAddress="CustomerContact.svc" service="SAIF.Services.WCF.Services.CustomerContactService" />
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
</configuration>

我的 global.asax 文件中也有这个,用于扩展少激活:

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the application is started
        Routing.RouteTable.Routes.Add(New ServiceRoute("CustomerContact", New ServiceHostFactory, GetType(SAIF.Services.WCF.Services.CustomerContactService)))
        Routing.RouteTable.Routes.Add(New ServiceRoute("OnlineLogin", New ServiceHostFactory, GetType(SAIF.Services.WCF.Services.OnlineLoginService)))
    End Sub

我用这个装饰了服务:

我的服务接口是UriTemplates

似乎无法以 REST 方式和通过 SOAP 访问它们。

谢谢! 山姆

【问题讨论】:

为什么它必须是相同的基本 URL?为什么不http://server/wcf/restservice/method/parametershttp://server/wcf/soapservice/service.svc @JohnSaunders - 我们将拥有 20 到 25 个 WCF 服务,所以我考虑采用这种命名约定以使其易于维护,但我想可能会有所不同。 我的建议是允许“soapservice”和“restservice”在 IIS 中成为单独的应用程序。 "restservice" 将是静态 URL 映射到路由的开始。 您使用的是哪个 .NET 版本?是.NET 4.0 【参考方案1】:

只需使用 OperationContract 和 WebGet 属性装饰您的方法。现在将以下内容添加到服务器 web.config 中的 system.serviceModel 元素中

    <standardEndpoints>
          <webHttpEndpoint>
            <!-- 
                Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
                via the attributes on the <standardEndpoint> element below
            -->
            <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true">
              <readerQuotas maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" />
            </standardEndpoint>
          </webHttpEndpoint>
        </standardEndpoints>

注意:哟 您可以从上面删除 json 端点(因为我们将使用新的 REST Api 实现清晰的 URL 概念),并在您的 global.asax 中替换以下内容:

Routing.RouteTable.Routes.Add(New ServiceRoute("CustomerContactService", New WebServiceHostFactory, typeof(SAIF.Services.WCF.Services.CustomerContactService)));

现在完成上述操作后,您应该能够通过 SOAP 和 REST 访问相同的服务,并且 URL 如下所示:

SOAP --> http://localhost/virtualdirectoryname/CustomerContactService.svc

REST --> http://localhost/virtualdirectoryname/CustomerContactService/method/parameters

现在在 IE 中浏览到您的服务,当您浏览到 .svc 文件时,您应该会看到 SOAP 服务器,当您浏览到其他 URL 时,您应该会看到浏览器中出现的 xml 文件,其中包含json格式的响应。

【讨论】:

以上是关于WCF 服务上的多个绑定的主要内容,如果未能解决你的问题,请参考以下文章

WCF 3.5 服务和多个 http 绑定

WCF:单个服务的多个绑定配置

WCF net.tcp 绑定:托管多个服务是不是需要端口共享?

如何使用多个绑定将 WCF json 绑定到 https?

如何配置 WCF 服务以同时使用 HTTP 和 HTTPS - 多个绑定不起作用

在 Azure 上的 WCF 中通过 SSL 配置 webHTTP 和 NetHTTP 绑定