问题标签 [duplex-channel]
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.
asp.net-mvc - Ninject:绑定 ServiceHost 实例以与 WCF 双工服务一起使用
我正在开发一个使用双工通道的 WCF 服务,以允许服务回调客户端以中继服务层中的组件引发的事件。代理类的定义和构造如下:
我需要在使用 ASP.NET 成员资格系统配置的类中获取此类的实例,因此我将其绑定如下:
我像这样注入它:
配置的成员资格提供程序由 Ninject 注入,如下所示:
我已经用没有双工服务的 WCF 服务层测试了注入模式,它工作正常。但是,当我包含双工服务时,Ninject 在绑定过程中失败并出现以下错误:
所以看起来我需要一个绑定到 EvsMembershipProxy 构造函数中使用的 ServiceHostBase 类来解决这个问题。但是,我不知道如何配置它。到目前为止,我解决 ServiceHostBase 绑定的最佳尝试是:
但是,这会在绑定期间失败并出现空引用异常。
如何绑定 ServiceHostBase 类型以便此注入起作用?
**编辑:简化原始代码以删除一些可以由 WCF 配置提供的 EvsMembershipProxy 构造函数参数**
.net - 双工 WCF 中的重新连接方案
我有两个通过双工 WCF 连接连接的应用程序。我工作得很好,只要连接是一致的。
我现在正在检查如何处理重新连接的情况,当连接丢失并且必须重新连接时。我正在努力理解如何在 WCF 中解决这个问题。
据我所知,这IChannel
是消耗品,但ChannelFactory
价格昂贵。所以我创建了一个工厂,然后是通道。每当我检测到通道中的Closed
orFaulted
事件时,我try
都会关闭通道,分离事件处理程序,然后创建另一个通道。
但是这种方法效果不佳,因为有时也会DuplexChannelFactory<T>.CreateChannel
出错,并抛出此异常:
工厂本身怎么可能以这种方式出现故障?
在 WCF 中处理断开/重新连接的正确方法是什么?
wcf - 双工消息或 Azure 队列服务
全部 ,
我们需要开发一个基于 azure 的平台,用户可以在其中配置多个制药仪器,开始对其进行测量并分析测量数据。基于 azure 的平台中的典型组件如下
1 - 基于 .NET 的 4 客户端应用程序在连接到每个仪器的计算机上运行。此客户端应用程序应从 azure 平台接收开始测量命令,执行测量并将结果更新回 azure*
2 - 一组服务[可能基于 REST],将从客户端应用程序获取结果并更新云上的数据库
3 - 一组可用于对数据进行分析的服务和业务逻辑
4 - 一个 asp.net 网络应用程序,用户可以在其中查看仪器详细信息、开始测量等
Azure 平台和客户端应用程序之间有两种通信方式,即客户端需要将结果更新到 azure,而azure 需要通过客户端应用程序在仪器上启动测量
在这种情况下,Azure 平台与客户端通信的推荐方法是什么。是不是以下任何一种
1 - 在客户端和服务器之间创建一个双工服务,并提供一个回调接口来启动测量
2 - 使用 Azure 消息队列为每个客户端创建命令队列。当需要开始测量时,一条消息将被放入队列中。客户端应用程序将始终从队列中读取并执行命令
或者我们有任何其他方法可以做到这一点,任何帮助表示赞赏
wcf - 如何正确配置 WCF NetTcp 双工可靠会话?
请原谅明显的自我问答,但此信息被广泛误解,并且几乎总是被错误地回答。所以我想把这些信息放在这里,供人们寻找这个问题的明确答案。
即便如此,仍有一些我无法确定的信息。我将把它放在问题的结尾(如果你对序言不感兴趣,请跳到那个)。
如何正确配置 WCF NetTcp 双工可靠会话?
关于这个主题有很多问题和答案,几乎所有问题和答案都建议inactivityTimeout="Infinite"
在您的配置中进行设置。这似乎不能正常工作,特别是对于 NetTcp 的情况(它可能对 WSDualHttp 绑定正常工作,但我从未使用过这些)。
还有许多其他问题通常与此相关:包括,客户端或服务器意外断开连接后通道没有故障,10 分钟后通道断开连接,通道随机断开连接...尝试打开时通道抛出异常...无法在同一端点上配置元数据...
请注意:下面有两个重要的概念。基础结构消息是 WCF 通信方式的内部消息,并由框架使用以保持事情顺利运行。操作消息是由于您的应用程序执行了某些操作而发生的消息,例如通过网络发送消息。基础设施消息在很大程度上对您的应用程序是不可见的(但它们仍然出现在后台),而操作消息是您的应用程序已采取的操作的结果。
我通过来之不易的反复试验得出的信息。
Infinite
在所有情况下似乎都不是有效的配置设置(当然,Visual Studio 验证架构不知道它)。- 有两个特殊的配置转换器,称为
InfiniteIntConverter
and有时InfiniteTimeSpanConverter
可以将值转换为or ,但我还没有弄清楚这似乎是有效的情况,有时它有效,有时它不有效。更重要的是,一些库似乎允许在配置中,而另一些则不允许,因此您可以在配置的一部分中成功,但在另一部分中失败。Infinite
Int.MaxValue
TimeSpan.MaxValue
Infinite
- 您必须在客户端和服务器上都配置BOTH
inactivityTimeout
和,。receiveTimeout
虽然这些值不必相同,但它们可能应该相同,因为如果它们不同,它们可能会引起混淆。(从技术上讲,如果需要,您可以保留inactivityTimeout
其默认值,但您应该了解它的值以及它的作用) inactivityTimeout
永远不要设置为一个很大的值,更小Infinite
或TimeSpan.MaxValue
.inactivityTimeout
有两个功能(这并没有被广泛理解)。第一个函数定义了通道上可以经过的最长时间而不接收任何“基础设施”或“操作”消息。第二个函数定义发送基础设施消息的时间段(指定时间的一半)。如果在超时期间没有收到任何基础设施或操作消息,则连接被中止。receiveTimeout
仅指定操作消息之间可以经过的最长时间。该值可以设置为较大的值,例如TimeSpan.MaxValue
(特别是如果您的频道在内部通过受信任的网络或通过 vpn 运行)。这个值定义了如果客户端和服务器之间没有活动(除了基础设施消息),可靠会话将“保持活动状态”多长时间。即,您的客户端不会调用接口的任何方法,并且您的服务器不会回调客户端。- 即使您的客户端和服务器之间没有任何操作活动,设置一个短的
inactivityTimeout
和一个大的也可以使您的可靠会话“保持稳定”。receiveTimeout
短暂的不活动超时(我喜欢保持默认的 10 分钟或更短)发送基础设施“ping”消息以保持 TCP 连接处于活动状态,而长接收超时保持可靠会话处于活动状态。同时在断开连接的情况下提供合理的超时。 - 如果您设置
inactivityTimeout
为较大的值,那么可靠会话将不可靠,因为它无法保持 Tcp 连接处于活动状态,也无法验证连接的完整性。在您尝试向该客户端发送消息并发现连接不再存在之前,它不会知道用户是否意外断开连接。这就是为什么许多使用 Infinite 进行此设置的人会在他们的服务中创建“Ping”方法,如果您正确配置了这些设置,这是完全没有必要的。 - 如果您设置
inactivityTimeout
的值大于receiveTimeout
then 它同样也不可靠,因为您仍将受receiveTimeout
for 操作消息的约束。IE。如果您忘记设置receiveTimeout
并将其保留为默认 10 分钟,则如果用户空闲 10 分钟,则连接将中止。 - 当客户端或服务器意外断开连接(应用程序崩溃、网络故障、有人绊倒电源线等)时,对方可能不会立即注意到。我
ChannelFaulted
在各种测试情况下附加了各种事件处理程序,有时连接会立即出现故障......其他时候它似乎根本没有故障。我通过反复试验发现的是,当它似乎没有故障时,它实际上会在inactivityTimeout
到期后发生故障。(所以如果它设置为 10 分钟,那么 10 分钟后它将调用该ChannelFaulted
事件)。 - 我还没有弄清楚为什么在某些情况下它会立即注意到断开连接,而在其他情况下它会等待计时器到期。在这两种情况下,我注意到框架抛出和处理的内部第一次机会通信异常,并且有调用 Abort the connection ......但不知何故,对事件处理程序的调用丢失了,它必须等待超时。我怀疑这与线程有关。
- 在尝试将元数据配置为跨 NetTcp 通道工作时,我得到了零星的结果。有时有效,有时无效。我读过很多报告说元数据不能在 NetTcp 上运行,而且你必须为元数据使用 Http 通道,但实际上我已经多次使用 net.tcp:// url 来生成代理人。然后我会改变一些东西,重新编译它就不再起作用了。改回来,就不行了。因此,让元数据通过 net.tcp 运行,并与同一端口上的端点共享(显然使用不同的地址),需要什么魔法咒语非常令人困惑。
- 在同一服务上同时配置 NetTcp 和 Metatdata 端点,并为连接参数(如 listenBacklog 和 maxConnections)指定非默认设置时,您还需要确保 Metadata 端点使用相同的设置,这通常意味着您必须定义一个自定义绑定,因为这些设置在标准 tcp mex 绑定中不可用。这包括设置
listenBacklog
andmaxPendingConnections
ontcpTransport
和groupName
andmaxOutboundConnectionsPerEndpoint
onconnectionPoolSettings
。 - ReliableSession 的 Ordered 设置的默认设置是
True
. 这比关闭它使用更多的开销。如果您不需要订购的消息,我建议将其关闭(需要在两边都设置)
-
配置我还是需要了解的:
如何正确配置共享 net.tcp 元数据端点?(我会在有机会时添加一个示例)目前,我正在指定一个 http get url 来绕过该问题。为什么它有时有效,有时无效,这与它是如此不一致。在 Visual Studio 中生成代理时,我不断收到错误“无法识别 URI 前缀”。
为什么 WCF 有时会在断开连接后立即对通道进行故障,有时会等待inactivityTimeout
过期?什么控制/导致一种与另一种行为?
c# - 远程端点请求的确认地址与应用程序消息的地址不同
我正在为带有 WPF 客户端的聊天应用程序编写 WCF Duplex 服务。服务代码如下
IChat回调
聊天服务
聊天服务
这托管在一个终端为 net.tcp://localhost:33333/chatservice 的控制台应用程序中,使用带有以下绑定配置的 netTcpBinding
在我的 WPF 客户端中,我使用 svcutil 实现了服务代理,如下所示:
IChatServiceCallback
聊天服务
IChatService频道
和聊天代理
在主应用程序中使用客户端配置:
好的,除了出于某种原因我在运行以下代码以连接到服务时遇到错误之外,一切都很好,代码是:
我得到的错误是:
远程端点请求的确认地址与应用程序消息的地址不同。无法打开通道,因为不支持此操作。确保用于创建通道的端点地址与设置远程端点的地址相同。
我的问题(对于很长的帖子感到抱歉,但我完全坚持这一点)只是是否有其他人遇到过这个问题并且可以指出我的答案吗?
编辑:我已更新以包含来自服务器和客户端的完整 serviceModel 部分,还更新了 ProxySingleton 以显示它确实实现了回调接口
c# - 双工 WCF net.tcp 服务为我的客户端处理了对象异常
我实现了一个用于与 WCF 聊天的客户端-服务器应用程序。我有一个广播回调。它工作正常,直到我改变了一些功能。我正在使用我的数据集修复数据。它在我的服务器上初始化并被使用。我实现了一个 XML 解析器机制,然后我收到了这样的错误:
无法访问已处置的对象。对象名称:“System.ServiceModel.InstanceContext”。
我正在使用我的服务:
然后我只打开 this._client 一次,我在每次调用时都使用这个对象。(我不会随时关闭这个对象。)
如果我在每次通话之前打开然后关闭它,那么它就可以工作。但在这种情况下,我的回调函数不起作用。而且我不能广播。所以我无法关闭我的客户对象。
你有关于这个错误的更多信息吗?或者有什么修复建议?
我的服务代码:
c# - 无法让 WCF Duplex ChannelFactory 正确出错
给定一个有效的 Binding 和 EndpointAddress,我有一个 WCF Duplex ChannelFactory,如下所示:
打开的事件触发没有问题,但是当我关闭我的服务时,错误的事件没有触发。如何让 Faulted 事件触发?
c# - WCF 服务无法捕获客户端的崩溃
我创建了一个使用 NetTCP 绑定的 WCF 服务。
我的服务被客户端访问,保存它的回调通道并在以后使用它来调用客户端(它是一个持久的 tcp 连接)。一切正常,但如果我决定突然终止客户端 - 我会得到一个我无法捕获的 SocketException(“现有连接被远程主机强行关闭”)。
我已经尝试了什么?
我已经在使用回调通道的每个方法中添加了 try-catch 子句,甚至在上层 - 启动我的服务的 WCFHost。
我尝试获取通道和回调通道并添加一个处理通道故障事件的方法:
/li>
简而言之,我正在尝试处理客户端抛出的异常 - 在服务器端。
wcf - WCF netTcpBinding issue: Contract requires Duplex, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it
I'm trying to create a callback in WCF service. Service so far was using basicHttpBinding, so I want to add another end point for netTcpBinding. Service is already hosted in IIS. First It was hosted in IIS 6, but then I installed IIS 7.
So, I'm getting the following error:
The requested service, 'net.tcp://localhost:1801/MyServiceName.svc/NetTcpExampleAddress' could not be activated. See the server's diagnostic trace logs for more information.
When seeing the log, this is the message:
So the main error is:
Contract requires Duplex, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it.
Here are my config files:
My Web.config for the server:
My App.config for the client:
Settings in my IIS:
If there are any other pieces of code that you need, please let me know and I'll update the question.
EDIT 1:
Here are more details from the code, of how I'm calling the service from the client (on client side):
where interfaces (on server side) are defined as:
and service (on server side) is defined as:
My methods so far are just a demo. Once the error related to this question is fixed, then I'll start with developing the methods.
.net - 具有动态主机/客户端的 WCF 双工服务
我对 WCF 还很陌生,所以如果我问的不是很清楚,请多多包涵。
我有一个环境,我有一组计算机(10 到 20 台)连接在 LAN 内。每台计算机都有一个静态 IP,并附带 2 个应用程序:AppA 和 AppB。
AppA 和 AppB 旨在相互共享信息,但我不希望 AppA 与 AppB 在同一台计算机上配对。我需要 AppA 从 LAN 中的计算机列表中选择一台计算机,然后尝试建立与所选计算机上运行的 AppB 的连接。
例如,我在计算机 X 上运行 AppA,并从计算机列表中选择连接到计算机 Y。AppA 将连接到计算机 Y 上运行的 AppB(它托管双工 WCF 服务)。
在我的 AppB 上,我已经定义了服务和回调接口。
我在这里有几个问题:
- 如何设置 AppB 使其 IP 取决于它正在运行的机器?我不能使用不同的 App.config 文件构建 AppB 10-20 次,每次都说明不同的主机基地址。
- 如何设置 AppA 使其可以动态连接到在不同 IP 地址上运行的不同 AppB?我打算创建一个 GUI,其中显示 IP 的静态列表(因为计算机列表是静态的,具有静态 IP),并且用户将从列表中选择一台计算机。然后使用代码,应用程序将打开一个双工通道,使用
DuplexChannelFactory
,Endpoint
设置为所选计算机的端点。
更新
我尝试了Tom Redfern 的回答,我能够在 AppB 上运行该服务,并且 AppA 能够连接到该服务。
但是,我已经实现了它,以便在运行时通过代码(自托管)启动服务。AppA(客户端)还在运行时使用DuplexChannelFactory
, 通过代码连接到服务。这意味着 AppA 和 AppB 都没有 WCF 内容App.config
。
这就是我在 AppB 上托管服务的方式:
HostService()
仅当用户在 AppB 中执行某些操作时才调用该方法。但是,当应用程序启动时,WcfSvcHost
窗口显示有 的实例MyService
,但它处于停止状态。错误详细信息说:
服务无法启动。该服务没有定义端点。请在配置文件中为该服务添加至少一个端点,然后重试。
我在调用行上设置了一个断点HostService()
,并且WcfSvcHost
在我调用之前已经显示了该消息HostService()
。除了我编写的代码之外,似乎还有一些东西正在尝试启动服务。