gpt4 book ai didi

WCF IIS 托管服务由单个服务实现的多个服务契约(Contract) - 如何通过配置在端点之间共享 uri

转载 作者:行者123 更新时间:2023-12-04 04:14:12 25 4
gpt4 key购买 nike

我有一组服务契约(Contract),将我的服务接口(interface)分成相关功能 block 。我目前正在使用单个服务类实现所有契约(Contract)(以后可能想拆分这些契约(Contract),但现在单个服务类就足够了)。

我正在尝试使用配置文件(而不是通过代码)配置端点。问题是我得到一个 ServiceActivationException因为两个端点(每个服务契约(Contract)一个)试图监听同一个 uri。异常细节说,要实现这一点,两个端点必须共享绑定(bind)对象,这是有道理的,但我不知道如何通过配置来做到这一点(我没有尝试通过代码来做到这一点,因为我在 IIS 中托管但是我可以想象这是一个在代码中配置的简单练习)。

以下是我目前正在使用的配置(这仍然是开发,所以我目前并不担心其中一些设置可能会暴露的安全问题等):

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="CDC.WebPortal.MidTier.MidTierAccessService"
behaviorConfiguration="MidTierServiceBehaviour" >
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.IProductService" />

<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.ICategoryService" />

<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />

</service>
</services>

<bindings>
<webHttpBinding>
<binding name="RestBindingConfiguration"
maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="104857600"/>
</binding>
</webHttpBinding>
</bindings>

<behaviors>
<serviceBehaviors>
<behavior name="MidTierServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>

所以我的问题是如何在两个端点之间共享这个绑定(bind)?

this SO question 中的评论建议我可能无法做到这一点,但我不相信这是正确的。

更新 1 根据 this MS publication我在做什么应该没问题...

更新2 如果有帮助,这里是 svc 文件内容:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>

更新 3 这是异常详细信息:

A binding instance has already been associated to listen URI '********************'. If two endpoints want to share the same ListenUri, they must also share the same binding object instance. The two conflicting endpoints were either specified in AddServiceEndpoint() calls, in a config file, or a combination of AddServiceEndpoint() and config.



更新 4 好的,我错过了 this之前,声明“在为特定 .svc 服务公开多个端点时,您将需要使用相对地址”。其原因与确定服务基地址的 IIS 虚拟目录有关,任何人都可以更详细地解释这一点,即为什么 IIS 需要为每个契约(Contract)提供相对寻址。

最佳答案

据我所知,上个月我一直在使用 WCF 进行大量工作,您不能为多个端点共享相同的确切 URI。在 WCF 中,“服务”不是由契约(Contract)的实现定义的,而是由契约(Contract)本身定义的(也遵循 WSDL 和标准 SOA 实践)。端点允许您通过多个协议(protocol)(因此使用不同的地址)公开单个服务,但您不能在同一个确切地址上共享不同的服务。逻辑上那是行不通的。

假设以下场景(这是您要完成的任务):

IProductService exposed @ http://localhost/service
ICategoryService exposed @ http://localhost/service
IMetadataExchange exposed @ http://localhost/service/mex

访问 MEX 端点很容易……它有一个唯一的 URI。但是,您如何访问 IProductService 或 ICategoryService?除了 URI 之外,没有什么可以让您区分两者。 WCF 没有任何东西允许它在应该发送到 IProductservice 的消息和应该发送到 ICategoryService 的消息之间进行路由。由于两者都使用相同的 URI,因此您确实存在冲突。每个服务契约(Contract)都必须通过唯一的 URI 公开。每个使用相同精确绑定(bind)的端点都必须使用不同的地址。

有一种方法可以实现您所需要的。问题是消息路由。 WCF 本身并不支持消息路由 OOB,但它确实提供了实现您自己的消息路由器的能力。 (或者,如果您愿意使用 beta 技术,.NET 4.0 附带了一个开箱即用的消息路由器,基于下面链接的文章,但具有改进的可配置性。) WCF 名副其实的女巫 Michele Bustamante 提供了一个完整的实现和描述消息路由的文章在以下链接:

http://msdn.microsoft.com/en-us/magazine/cc500646.aspx
http://msdn.microsoft.com/en-us/magazine/cc546553.aspx

一般的想法是您设置一个监听单个 URI 的单个服务。此服务使用通配符分派(dispatch)到单个服务操作,然后确定将每条消息路由到哪个唯一 URI。您可以按照您希望的任何方式进行确定,但最简单的是通过请求操作,假设您的两个接口(interface) IProductService 和 ICategoryService 上的每个操作都是全局唯一的。但是,您最终将获得更多服务……路由器本身是一个独特的 WCF 服务,需要像其他任何服务一样托管。

关于WCF IIS 托管服务由单个服务实现的多个服务契约(Contract) - 如何通过配置在端点之间共享 uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com