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 的相关文章

  • WCF 回调:它可以与 Java 互操作吗?

    目前 我以 正常 方式实现所有 Web 服务 也就是说 我在 Eclipse 中创建一个 WSDL 文件 然后使用 WSCF blue 一个 Visual Studio 扩展 自动生成必要的代码 它是回复 请求 不过 我希望改用回调 这样我
  • 找不到 IIS Express 静态文件

    首先我要说的是 我有 Linux 背景 在 Windows 上进行开发对我来说相当陌生 我正在开发一个在 Visual Studio 中打开的 ASP NET 项目 该项目最初设置为通过 IIS 运行 VS 主动询问我是否愿意尝试 IIS
  • 我希望能够使用 lambda 表达式来指定要通过 wcf 服务返回的值范围

    我不知道这是否可能 但这会很酷 问题是这是否可能 但如果可能的话 举一个例子 我不确定您将使用什么方法签名来将 lambda 表达式传递到其中 例如方法IList
  • PHP 在 IIS7 上未报告任何错误

    我正在使用我们的 XAMPP 设置作为测试服务器来开发 PHP 应用程序 一旦应用程序准备好部署 我必须将其上传到客户端的服务器 问题是客户端的服务器正在运行 IIS 7 每次出现 PHP 错误时 它只会显示一个空白页面 现在 我的应用程序
  • 无法使用前导 ../ 在顶级目录之上退出

    我有一个 asp net 网站 我们有管理区域 其中的登录页面仅供管理员使用 并且所有网站都允许所有人使用 当我收到此错误时 我需要询问如何为其定义正确的安全配置 Cannot use a leading to exit above the
  • WCF:在 ServiceModel 客户端配置部分中找不到引用协定“IService”的默认端点元素。当托管在 IIS 中时

    我有一个 WCF 服务托管在 IIS 中 我还有一个 WCF 客户端 控制台应用程序 我用过svcutil构建代理类和配置文件 然后将它们添加到我的客户端项目中 它建造得很好 但是当我尝试运行该程序时 它抛出以下异常 在 ServiceMo
  • 无法从 Windows 7 上的 Windows 服务启动桌面应用程序

    HI 我在 Windows 7 上有 C WCF Windows 服务 以具有管理员权限的用户身份登录 我正在尝试在服务启动后启动桌面应用程序 我发现的所有讨论都是关于 Windows 工作站和桌面 我创建了一个单独的线程 设置线程工作站和
  • 严重: getRealPathFromConn 错误

    目前我正在调试我们的应用程序中一个看似随机的错误 我将尽力提供尽可能多的细节 基本上一段时间后 我们服务器上某个应用程序的应用程序池就会停止 我必须启动它 或者有时重新启动 Coldfusion 或更糟糕的是机器才能再次运行 服务器日志表明
  • Response.Buffer / Flush 似乎不起作用

    我有一个经典的 asp 页面 用户使用 Response Buffer True 和 Flush 在我的本地电脑上 这个页面运行得非常好 我已将该页面上传到我的网络服务器 但它不起作用 我唯一能够检查的是两台机器上 IIS 下的 ASP B
  • 可能有相同的合同,相同的绑定,相同的地址,但不同的端口?

    我有需要通过 basicHTTPBinding 进行通信的手持设备 我有合同 一切都按照广告进行 我需要扩展它以轻松支持测试环境 培训 当然还有生产的更改 我选择了端口路线 认为我可以公开具有端口差异的不同端点 并根据端口决定我想要来自哪个
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 重写规则错误:HTTP 错误 500.50 - URL 重写模块错误。表达式“https://abc.com/{R:1}”无法展开

    每当有人通过 HTTP 协议发出请求时 我都会重写 url 以使其成为 HTTPS 这是 web config 中的代码
  • 静态文件不通过 IIS 提供服务,而是通过 localhost 提供服务 - ASP.NET Core 3.1 MVC 和 C#

    我是编程新手 我能够自己解决大部分问题 但这个问题超出了我的想象 我正在使用 Visual Studio 在本地运行我的应用程序 当我在 VS 中单击 IIS Express 来运行该应用程序时 该应用程序将在带有 url 的浏览器中打开h
  • ASP.NET IIS 7.5 HTTP 500.21 错误

    我在设置本地站点时遇到问题 该项目使用 ASP NET Framework 4 0 我的 DefaultAppPool 使用 4 0 并集成托管管道模式 这是我得到的错误 HTTP Error 500 21 Internal Server
  • IIS 8 HTTPS/需要 SSL 导致超时错误

    尝试通过 IIS 8 通过 SSL 发布网站 但出现超时错误 任何帮助表示赞赏 采取的步骤 已验证该网站可以通过 HTTP 访问 http xxx xxx xxx xxx有效 此时使用 IP 地址 如果重要的话 IIS gt 服务器证书 g
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • 如何在 IIS 10 上禁用 HTTP/2

    IIS 10 声称完全支持 HTTP 2 我想知道是否有办法在 IIS 10 上关闭 HTTP 2 要在 Windows 10 HTTP SYS 上禁用 HTTP 2 请在 Windows 10 桌面上的 HKEY LOCAL MACHIN
  • Spring Boot - YML 配置 - 合并时擦除条目

    我的应用程序有一个基本 YML 配置 在类路径中如下所示 hello world values bar name bar name description bar description foo name foo name descript
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 模拟 WCF 客户端代理的最佳方法

    有没有办法使用 Rhino 模拟框架来模拟 WCF 客户端代理 以便我可以访问 Channel 属性 我正在尝试对 Proxy Close 方法进行单元测试 但由于代理是使用抽象基类构造的ClientBase

随机推荐

  • 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