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

2024-01-21

我有一组服务合同,它将我的服务接口分成相关功能块。我目前正在使用单个服务类实现所有合约(稍后可能需要拆分这些合约,但目前单个服务类就足够了)。

我正在尝试使用配置文件(而不是通过代码)配置端点。问题是我得到了ServiceActivationException因为两个端点(每个服务合约一个)正在尝试监听同一个 uri。异常详细信息表明,要实现此目的,两个端点必须共享绑定对象,这是有道理的,但我无法弄清楚如何通过配置执行此操作(我没有尝试通过代码执行此操作,因为我在 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>

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

评论于这个问题 https://stackoverflow.com/questions/1182725/multiple-endpoints-under-iis建议我可能无法做到这一点,但我不认为这是正确的。

UPDATE 1根据本 MS 出版物 http://msdn.microsoft.com/en-us/magazine/cc163412.aspx#S4我正在做的事情应该没问题...

UPDATE2这是 svc 文件内容(如果有帮助的话):

<%@ ServiceHost Language="VB" Debug="true"
                Service="*********************.MidTierAccessService"
                Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>

UPDATE 3这是异常详细信息:

绑定实例已关联到侦听 URI '********************'。如果 两个端点想要共享相同的 ListenUri,它们也必须共享相同的绑定 对象实例。两个冲突的端点要么在 配置文件中的 AddServiceEndpoint() 调用,或 AddServiceEndpoint() 的组合 和配置。

UPDATE 4好吧,我错过了this http://msdn.microsoft.com/en-us/magazine/cc163412.aspx#S3之前,声明“在为特定 .svc 服务公开多个端点时,您将需要使用相对地址”。造成这种情况的原因与 IIS 虚拟目录确定服务的基地址有关,任何人都可以更详细地解释这一点,即为什么 IIS 需要每个合同的相对寻址。


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

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

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,因此确实存在冲突。每个服务合同必须通过唯一的 URI 公开。使用完全相同的绑定的每个端点都必须使用不同的地址。

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

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

总体思路是设置一个监听单个 URI 的服务。该服务使用通配符调度到单个服务操作,然后确定将每条消息路由到哪个唯一的 URI。您可以以任何您希望的方式做出决定,但最简单的是通过请求操作,假设两个接口(IProductService 和 ICategoryService)上的每个操作都是全局唯一的。然而,您最终将获得更多服务...路由器本身是一个独特的 WCF 服务,需要像任何其他服务一样进行托管。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri 的相关文章

随机推荐

  • Docker 远程 API 是否有等效的“docker run --rm ...”?

    我希望能够在容器退出后轻松清理它们 这可以通过远程 API 实现吗 除了我自己发现出口并使用 DELETE containers 端点删除 拉斯克斯的答案现在已经过时了 Docker 远程 API 1 25shifted rm从客户端到服务
  • 如何使用 python 或(和)ruby 卸载任何应用程序

    我没有通过这个问题在网上找到任何有用的主题 这些都是关于如何卸载 python 或卸载 ruby 但没有关于 TOPIC 的信息 主要问题是我使用了其他有趣的answers https stackoverflow com questions
  • GDI泄漏问题

    我注意到使用任务管理器 以下代码中存在 GDI 泄漏 每次执行此代码时 执行此代码的进程中 GDI 对象的计数都会增加 1 但我似乎找不到问题 任何帮助 将不胜感激 create new DC based on current HDC hD
  • 如何让网页高度适合屏幕高度

    我需要使我的网页高度适合屏幕尺寸的高度而不滚动 HTML
  • 使用 R ggplot2 和 ggplotly 在地图上一年的累积点

    我正在尝试在地图上累计绘制每个月打开的新位置 我可以每月创建一个包含新位置的动画 但不能累积 换句话说 我希望看到新地点添加到现有地点 这是示例数据 DF lt data frame latitude c 42 29813 41 83280
  • 从 WooCommerce 购物车错误消息中删除库存数量

    在 WooCommerce 中 我将 woocommerce gt settings gt products gt inventory gt stock display format 设置为 永远不要显示剩余库存数量 但是 如果客户将产品广
  • 将 Numpy 数组保存为图像(说明)

    我在之前的帖子中找到了答案 将 Numpy 数组保存为图像 https stackoverflow com questions 902761 saving a numpy array as an image 唯一的问题是 没有太多关于使用
  • 在 Python/Bash 中通过 SSH/Sudo 测试文件/目录是否存在 [重复]

    这个问题在这里已经有答案了 我正在远程服务器上安装证书 并想在覆盖它们之前检查它们是否存在 服务器仅允许通过 ssh 公钥进行非 root 访问 我可以sudo s在 shell 中 root 一次 需要 root 权限 因为其他人无法读取
  • Play 框架模板自动导入模型。_ 除其他外

    似乎在 Play 框架模板中 有一个隐式的 import models 和 import play api data Form 因为我的代码 title String myForm Form User 无需在第一行后放置显式导入语句即可工作
  • ASP运行在64位环境下,使用Access数据库

    我有一位客户自 2003 年以来一直在运行一个使用 asp 3 0 构建的简单网站 其中包含一个 access 数据库文件 mdb 最近 该客户购买了一台带有 Windows 2003 Server 64 位的新服务器 该网站不再运行 显示
  • WMI 调用获取驱动程序

    我是 WMI 的新手 它是什么 例如 我可以在 C 中使用 WMI 调用来获取我的 PC 上的驱动程序列表吗 如果是这样 我该打电话给哪个班级 要列出已安装的驱动程序 您可以使用Win32 PnPSignedDriver http msdn
  • Python 中的球形 k 均值实现

    我一直在使用scipy 的 k 均值 http docs scipy org doc scipy reference cluster vq html已经有一段时间了 我对它在可用性和效率方面的工作方式感到非常满意 然而 现在我想探索不同的
  • C# 5.0 异步中的可等待和等待者

    Task 或Task 对象是可等待的 因此我们可以对返回值为Task 或Task 的对象使用await 键 Task 或 Task 是最常用的可等待对象 我们还可以定义自己的可等待对象 该对象应该具有以下资格 它有一个 GetAwaiter
  • 绑定字符串格式

    我有一组要显示的文本块 并且我需要每个文本块的文本以不同的方式显示 我当前正在标记属性中保存格式字符串 并且需要以此格式显示文本 如何绑定 StringFormat 部分 类似于下面的部分
  • Web容器无法从docker compose调用后端容器

    我仍在码头工人的世界中找到自己的立足点 我正在尝试将我的小宠物项目 Docker 化 前端是一个 vue cli 应用程序 它与包含 spring boot 制作的 Restful API 的后端进行通信 所以我的方法是为后端和前端声明两个
  • 视图控制器未收到 -shouldAutorotateToInterfaceOrientation:第二次加载时的消息?

    我有一个UIViewController我用它来控制 弹出 视图 以便在整个应用程序中查看图像 它支持自动旋转 因为无论方向如何 它都会自动调整图像大小以正确适合 这工作得很好 但只是在我第一次初始化并显示视图控制器时 当它关闭时 我将删除
  • HTML5 音频/视频停止缓冲区

    有没有办法停止浏览器中的缓冲 我有一个指向某个 mp3 文件的音频标签 浏览器在播放音频时开始缓冲音频 我可以停止缓冲吗 我知道理想情况下 如果您的音频数据输入速度比客户端可以播放的速度更快 为什么不缓冲它 我要求的是音频播放器应该只缓冲最
  • 在 Unity 编辑器中显示数组成员的某些属性,具体取决于这些数组成员的其他属性

    我有课MyClass它具有枚举和属性 根据枚举 我想在编辑器中显示某些属性 有这样的枚举 first Second 和属性 health step position 如果选择第一个 则在编辑器中显示名称和步骤 如果选择第二个 则显示步骤和位
  • 在一个函数中生成幂集,没有显式递归,并且在 Racket 中仅使用最简单的原语

    Note 这是对家庭作业的奖励 但我花了太长时间尝试却毫无结果 非常感谢帮助 但我认为没有必要 Premise 为数字列表生成幂集 但不使用任何辅助函数 显式递归 循环或除cons first rest empty empty else l
  • WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri

    我有一组服务合同 它将我的服务接口分成相关功能块 我目前正在使用单个服务类实现所有合约 稍后可能需要拆分这些合约 但目前单个服务类就足够了 我正在尝试使用配置文件 而不是通过代码 配置端点 问题是我得到了ServiceActivationE