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/parameters
和http://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 net.tcp 绑定:托管多个服务是不是需要端口共享?