问题标签 [wcf-routing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何在一对多场景中使用 IDuplexSessionRouter?
我的 WCF 服务是这样工作的:您通过调用服务方法订阅它们,比如 Subscribe()。他们通过回调通道将结果发回给您,例如 MessageReceived(string message)。我现在的问题是我的路由器仅将第一个订阅调用路由到其端点列表中的第一个服务。结果,我只从一个服务端点获取回调消息,而不是两者。我希望订阅两个端点并从两个端点获取回调。这是我的代码(请注意,我在 serviceAddresses 字符串中有两个 net.tcp 地址):
所以再一次......这就是我想要的:
这就是我现在得到的:
c# - WCF 路由服务 - 动态错误处理
我正在了解 WCF 路由服务可以做什么。仍处于“搞砸它,看看它能做什么”阶段。
我对路由服务的理解是,当消息通过时,服务会尝试将其传递给备份列表中最先出现的端点。如果失败了,它将继续尝试下一个,然后是下一个,直到某些东西起作用或没有什么可尝试的。
我想做的是访问该失败事件,以便我可以:
- 记录失败
- 通过电子邮件发送端点失败的通知
- 可选择从备份列表中删除端点,这样它就不会减慢未来消息流经系统的速度
无法找到如何扩展 WCF 框架来处理此特定事件。
这是 WCF 路由服务可以做的事情吗?任何朝着正确方向的轻推将不胜感激。
目前,我在 IIS 下托管了 30 个动态生成的路由服务(或者更准确地说,是 Visual Studio 2010 的 ASP.NET 开发服务器)。我在 Global.asax 中设置服务的路由,如下所示。
ServiceUtility 和 RoutingServiceHostFactory 是自定义类。请注意,IPolicyService 是我感兴趣的程序集中的 WCF 服务合同接口。
我正在生成我的 ServiceHosts,如下所示。为简洁起见,我省略了一些辅助方法。
端口 2521 在另一端有一个实际的网站,它托管一些 WCF 服务。上面提到的其他端口没有任何监听。
对于上下文,这是我的路由站点的 Web.config。请注意,超时等只是我搞砸的结果,不要太认真。
编辑
为了回应 TheDoctor 在下面的回答,我认为我应该扩展自我最初发布以来我一直在使用这个尝试的解决方案所做的事情。我试过实现 IErrorHandler 接口。但是,我没有太多运气。
请注意,在上面的示例中,我的 RoutingServiceHostFactory 略有变化。我现在将 RoutingServiceErrorHandlerInjector 行为添加到服务描述中。请注意,出于说明的目的,我还在备份列表中添加了额外的死端点。
我的期望是我应该触发从 deadDestination1 到 deadDestination5 的 ProvideFault 或 HandleError 事件。我在调试器中的 NotImplementedExceptions 上设置了断点。但该代码永远不会被激活。这些调用最终会到达备份列表末尾的真实地址,并且我用来测试此 RoutingService 的客户端/服务器应用程序运行良好。通信速度较慢,但仍在超时限制内。
但是,如果我从上面的 ConfigureRoutingBehavior 方法中注释掉该行backupList.Add(realDestination);
,则执行 RoutingServiceErrorHandler.ProvideFault 方法......但它只包含与 deadDestination5 相关的信息。可能已经为 deadDestination1 到 deadDestination4 生成的任何异常或错误在我身上消失了。
此外,我还尝试使用 RedGate 调试器单步执行 RoutingService 的反射代码。这对我来说很棘手,因为我不习惯调试优化的代码,所以几乎没有任何变量可供我实际阅读。但从目测以下逻辑的步骤来看:
System.ServiceModel.Routing.ProcessRequestAsyncResult 中的相关部分如下所示。这些也是通过 RedGate 调试的,所以不能修改。我相信 RedGate 和 Microsoft 发布的来源是准确的。#他怀疑地
根据我的肤浅阅读,在我看来 ProcessRequestAsyncResult 正在通过 ProcessRequestAsyncResult.StartProcessing 方法逐步完成备份列表的工作。然而,StartProcess() 似乎并没有抛出每一个异常,而是它有选择地选择是否抛出异常。
似乎只有最终死地址的异常实际上是由 StartProcess() 抛出的,然后由 RoutingService.BeginProcessRequest catch 子句传递,然后才最终在我的 IErrorHandler 实现中一直激活。
这强烈地向我表明,我在这里尝试做的事情不能用 System.ServiceModel.Routing 命名空间的当前实现来完成。请注意,RoutingService 是一个密封类,因此即使我认为这是一个好主意(我不这样做),我也不能用我自己的基类来扩展它来改变这种行为。
但话又说回来,请注意,这是一个肤浅的阅读。我很容易出错。事实上,我非常希望被证明是错误的。我非常希望找到一种方法让 RoutingService 做我想做的事情,而不是自己动手。
wcf - Wcf 路由器 - 双工服务 - 重新订阅
我有一个双工 wcf 服务,它保存(在内存中)对其客户端的回调引用列表。wcf 服务有订阅和取消订阅两种方法。
一个 wcf 服务器和多个客户端都可以正常工作。当我使用 Wcf 路由器服务引入两个具有负载平衡的 wcf 服务器时,问题就开始了。
例如,我有两个 wcf 服务器(wcf1 和 wcf2)和一个路由器服务器(r1)。当客户端调用“订阅”到路由器端点时,它会将该请求广播到 wcf1 和 wcf2 服务器。这样他们两个都持有对客户端的回调引用。当其中一个 wcf 服务器关闭时,问题就开始了。如果 wcf1 服务器出现故障,则所有订阅都将丢失。因此,当它恢复活动时,就没有可用的订阅来进行回调,也没有办法通知客户端重新订阅。
我尝试在客户端收听故障事件。这不会被触发,因为它连接到路由器端点。只有当路由器服务器关闭时,该事件才会触发。
有没有人遇到过和我类似的问题?难道我做错了什么?
c# - WCF 路由服务,将响应转发到另一个服务
我们计划使用 WCF 路由服务。
假设我们有两个队列(q1,q2),路由服务从 q1 中提取消息,将其转发给请求-回复服务,一旦路由服务收到响应,它会再次将其转发给 q2。
我们现在被困在如何将响应转发到另一个队列上,这是 WCF RoutingService 中可能的用例吗?
提前感谢您的帮助。
.net - WCF 路由服务桥接两个域
在我的企业中有两个域 A 和 B。域 A 中的应用程序需要调用属于域 B 的多个服务(WCF、Java Soap 服务)。域 B 依赖 Kerberos 和 Siteminder 身份验证来对其客户端进行身份验证。域 A 主要使用相互 SSL 身份验证。
这个新的路由服务将支持域 B 中的所有底层服务并代理身份验证。它将使用相互 SSL 对域 A 调用方应用程序进行身份验证,并将其请求转发到适当的端点。
如何利用 WCF 路由功能来弥合两个域之间的这种差距?
asp.net - 在 IIS 上的 ASP.NET Web 应用程序的分离应用程序域中运行 WCF 服务及其路由
我有一个必须在单独的应用程序域(而不是 ASP.NET 应用程序域)中执行的 WCF 服务。
由于我的应用程序的各种部署方案,我想将我的 WCF 服务与我的 Web 服务器 (IIS) 分离。(注意:当您使用 OWin 和 Web API 时,这是 Owin 的主要优势)。
我可以在单独的应用程序域中运行 WCF 服务而无需路由服务,或者我可以在 ASP.NET 应用程序域中配置路由并在 WCF 调度运行时的自定义 SynchronizationContext 中的单独应用程序域中运行 WCF 服务。
但我想使用更好的方法。
是否可以在分离的应用程序域中运行带有路由的 WCF 服务?
c# - 在运行时动态更新 WCF 路由服务配置
我一直在关注 MSDN 上的 WCF 路由服务教程:
在尝试将控制台示例转换为 IIS 托管原型时经历了很多痛苦之后,我现在有了一个 WCF 路由服务,它按照教程每 5 秒更新一次其配置。
我现在需要从网页触发此更新,而不是定时器每 5 秒自动更新一次,但找不到任何有关如何执行此操作的示例。类似于管理屏幕的东西,它处理存储在数据库中的端点的 CRUD 操作。如果用户对配置进行更改,路由服务将需要动态更新其配置。
显然,您可以使用 UDP 公告和发现服务执行类似的操作,但我不希望触发从另一个应用程序调用的更新的简单端点就足够了。
如何获取对路由服务的引用UpdateBehavior
以便手动调用该UpdateRules
方法?
c# - ServiceModel.Routing 的默认服务行为是什么?
ServiceModel.Routing 上的默认服务行为是什么?
我不是在谈论 Azure 的东西,我的意思是这些接口来自
System.ServiceModel.Routing
- IDuplexSessionRouter
- IRequestReplyRouter
- ISimplexDatagramRouter
- ISimplexSessionRouter
我了解在工作的实际服务端点为所需上下文选择正确的“绑定”,....
(即这个路由器(hand-rolled-service_bus)实际上将(通过 EndPointName)消息路由到的服务)
(当然,将来会有几个服务根据调用者提供的 ---EndPointName--- 路由到各种服务)
...但是这些路由“合同”在这个中间层如何处理并发和实例模式实现这些 System.ServiceModel.Routing 命名空间接口中的一个或多个的 路由服务?!
我是否过度思考这些路由合同(接口)只是传递消息?当我输入这个时,我想知道我是否应该真正创建一个继承所需路由接口/合同的类,并尝试手动应用我所需的服务行为,就像普通的WCF 接口一样......
所有示例都只是“使用”这些路由接口,而不是创建实现其中一个的类并在其后附加服务行为。
c# - System.ServiceModel.Routing 接口甚至可以做任何事情吗?!
让我们说一个 Windows 服务初始化一个 wcf 客户端类(包含到工作 WCF 服务的代理),并且假设这个客户端通过路由服务工作以映射到执行该工作的实际服务。""BeastyWorkerService""
我的意思是面对它,您的客户端配置为从端点“net.tcp://10.0.0.xx/sample/ep_poopie”喷出,或者更准确地说是与端点“net.tcp://10.0.0.xx/”对话sample/ep_poopie”和“-”routingService“-”另一端的实际工作人员,我们的“”BeastyWorkerService“”准备在该端点“net.tcp://10.0.0.xx/sample/ep_poopie”上接受”。
如果您杀死路由服务,工作人员仍然会收到消息并且工作完成..我知道路由器可能对广播协议桥接或其他任务很方便,但我认为皇帝没有穿衣服..我错了吗?? 我错过了什么?我爱 WCF,但它肯定会很痛苦....
c# - 组合/聚合许多底层服务响应的 WCF 路由器
我有一个带有两个底层服务的 WCF 路由服务。我想要做的事情是结合来自两个后端服务的响应并返回一个聚合响应(由路由器调用的两个服务中的每一个组成)。
这两个服务中的每一个都返回字符串数组。例如,如果第一个服务返回new string[2] { "red", "green" }
并且第二个服务的结果是 new string[2] { "table", "chair" }
,那么从路由器返回客户端的整个最终响应是new string[4] { "red", "green", "table", "chair" }
。
提前致谢!