问题标签 [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.

0 投票
1 回答
492 浏览

asp.net-mvc - Ninject:绑定 ServiceHost 实例以与 WCF 双工服务一起使用

我正在开发一个使用双工通道的 WCF 服务,以允许服务回调客户端以中继服务层中的组件引发的事件。代理类的定义和构造如下:

我需要在使用 ASP.NET 成员资格系统配置的类中获取此类的实例,因此我将其绑定如下:

我像这样注入它:

配置的成员资格提供程序由 Ninject 注入,如下所示:

我已经用没有双工服务的 WCF 服务层测试了注入模式,它工作正常。但是,当我包含双工服务时,Ninject 在绑定过程中失败并出现以下错误:

所以看起来我需要一个绑定到 EvsMembershipProxy 构造函数中使用的 ServiceHostBase 类来解决这个问题。但是,我不知道如何配置它。到目前为止,我解决 ServiceHostBase 绑定的最佳尝试是:

但是,这会在绑定期间失败并出现空引用异常。

如何绑定 ServiceHostBase 类型以便此注入起作用?

**编辑:简化原始代码以删除一些可以由 WCF 配置提供的 EvsMembershipProxy 构造函数参数**

0 投票
2 回答
361 浏览

.net - 双工 WCF 中的重新连接方案

我有两个通过双工 WCF 连接连接的应用程序。我工作得很好,只要连接是一致的。

我现在正在检查如何处理重新连接的情况,当连接丢失并且必须重新连接时。我正在努力理解如何在 WCF 中解决这个问题。

据我所知,这IChannel是消耗品,但ChannelFactory价格昂贵。所以我创建了一个工厂,然后是通道。每当我检测到通道中的ClosedorFaulted事件时,我try都会关闭通道,分离事件处理程序,然后创建另一个通道。

但是这种方法效果不佳,因为有时也会DuplexChannelFactory<T>.CreateChannel出错,并抛出此异常:

工厂本身怎么可能以这种方式出现故障?

在 WCF 中处理断开/重新连接的正确方法是什么?

0 投票
2 回答
457 浏览

wcf - 双工消息或 Azure 队列服务

全部 ,

我们需要开发一个基于 azure 的平台,用户可以在其中配置多个制药仪器,开始对其进行测量并分析测量数据。基于 azure 的平台中的典型组件如下

1 - 基于 .NET 的 4 客户端应用程序在连接到每个仪器的计算机上运行。此客户端应用程序应从 azure 平台接收开始测量命令,执行测量并将结果更新回 azure*

2 - 一组服务[可能基于 REST],将从客户端应用程序获取结果并更新云上的数据库

3 - 一组可用于对数据进行分析的服务和业务逻辑

4 - 一个 asp.net 网络应用程序,用户可以在其中查看仪器详细信息、开始测量等

Azure 平台和客户端应用程序之间有两种通信方式,即客户端需要将结果更新到 azure,而azure 需要通过客户端应用程序在仪器上启动测量

在这种情况下,Azure 平台与客户端通信的推荐方法是什么。是不是以下任何一种

1 - 在客户端和服务器之间创建一个双工服务,并提供一个回调接口来启动测量

2 - 使用 Azure 消息队列为每个客户端创建命令队列。当需要开始测量时,一条消息将被放入队列中。客户端应用程序将始终从队列中读取并执行命令

或者我们有任何其他方法可以做到这一点,任何帮助表示赞赏

0 投票
0 回答
2093 浏览

wcf - 如何正确配置 WCF NetTcp 双工可靠会话?

请原谅明显的自我问答,但此信息被广泛误解,并且几乎总是被错误地回答。所以我想把这些信息放在这里,供人们寻找这个问题的明确答案。

即便如此,仍有一些我无法确定的信息。我将把它放在问题的结尾(如果你对序言不感兴趣,请跳到那个)。

如何正确配置 WCF NetTcp 双工可靠会话?

关于这个主题有很多问题和答案,几乎所有问题和答案都建议inactivityTimeout="Infinite"在您的配置中进行设置。这似乎不能正常工作,特别是对于 NetTcp 的情况(它可能对 WSDualHttp 绑定正常工作,但我从未使用过这些)。

还有许多其他问题通常与此相关:包括,客户端或服务器意外断开连接后通道没有故障,10 分钟后通道断开连接,通道随机断开连接...尝试打开时通道抛出异常...无法在同一端点上配置元数据...

请注意:下面有两个重要的概念。基础结构消息是 WCF 通信方式的内部消息,并由框架使用以保持事情顺利运行。操作消息是由于您的应用程序执行了某些操作而发生的消息,例如通过网络发送消息。基础设施消息在很大程度上对您的应用程序是不可见的(但它们仍然出现在后台),而操作消息是您的应用程序已采取的操作的结果。

我通过来之不易的反复试验得出的信息。

  • Infinite在所有情况下似乎都不是有效的配置设置(当然,Visual Studio 验证架构不知道它)。
  • 有两个特殊的配置转换器,称为InfiniteIntConverterand有时InfiniteTimeSpanConverter可以将值转换为or ,但我还没有弄清楚这似乎是有效的情况,有时它有效,有时它不有效。更重要的是,一些库似乎允许在配置中,而另一些则不允许,因此您可以在配置的一部分中成功,但在另一部分中失败。InfiniteInt.MaxValueTimeSpan.MaxValueInfinite
  • 您必须在客户端和服务器上都配置BOTH inactivityTimeout和,。receiveTimeout虽然这些值不必相同,但它们可能应该相同,因为如果它们不同,它们可能会引起混淆。(从技术上讲,如果需要,您可以保留inactivityTimeout其默认值,但您应该了解它的值以及它的作用)
  • inactivityTimeout永远不要设置为一个很大的值,更小InfiniteTimeSpan.MaxValue.
  • inactivityTimeout有两个功能(这并没有被广泛理解)。第一个函数定义了通道上可以经过的最长时间而不接收任何“基础设施”或“操作”消息。第二个函数定义发送基础设施消息的时间段(指定时间的一半)。如果在超时期间没有收到任何基础设施或操作消息,则连接被中止。
  • receiveTimeout仅指定操作消息之间​​可以经过的最长时间。该值可以设置为较大的值,例如TimeSpan.MaxValue(特别是如果您的频道在内部通过受信任的网络或通过 vpn 运行)。这个值定义了如果客户端和服务器之间没有活动(除了基础设施消息),可靠会话将“保持活动状态”多长时间。即,您的客户端不会调用接口的任何方法,并且您的服务器不会回调客户端。
  • 即使您的客户端和服务器之间没有任何操作活动,设置一个短的inactivityTimeout和一个大的也可以使您的可靠会话“保持稳定”。receiveTimeout短暂的不活动超时(我喜欢保持默认的 10 分钟或更短)发送基础设施“ping”消息以保持 TCP 连接处于活动状态,而长接收超时保持可靠会话处于活动状态。同时在断开连接的情况下提供合理的超时。
  • 如果您设置inactivityTimeout为较大的值,那么可靠会话将不可靠,因为它无法保持 Tcp 连接处于活动状态,也无法验证连接的完整性。在您尝试向该客户端发送消息并发现连接不再存在之前,它不会知道用户是否意外断开连接。这就是为什么许多使用 Infinite 进行此设置的人会在他们的服务中创建“Ping”方法,如果您正确配置了这些设置,这是完全没有必要的。
  • 如果您设置inactivityTimeout的值大于receiveTimeoutthen 它同样也不可靠,因为您仍将受receiveTimeoutfor 操作消息的约束。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 绑定中不可用。这包括设置listenBacklogand maxPendingConnectionsontcpTransportgroupNameand maxOutboundConnectionsPerEndpointon connectionPoolSettings
  • ReliableSession 的 Ordered 设置的默认设置是True. 这比关闭它使用更多的开销。如果您不需要订购的消息,我建议将其关闭(需要在两边都设置)
  • -

配置我还是需要了解的:

如何正确配置共享 net.tcp 元数据端点?(我会在有机会时添加一个示例)目前,我正在指定一个 http get url 来绕过该问题。为什么它有时有效,有时无效,这与它是如此不一致。在 Visual Studio 中生成代理时,我不断收到错误“无法识别 URI 前缀”。

为什么 WCF 有时会在断开连接后立即对通道进行故障,有时会等待inactivityTimeout过期?什么控制/导致一种与另一种行为?

0 投票
1 回答
465 浏览

c# - 远程端点请求的确认地址与应用程序消息的地址不同

我正在为带有 WPF 客户端的聊天应用程序编写 WCF Duplex 服务。服务代码如下

IChat回调

聊天服务

聊天服务

这托管在一个终端为 net.tcp://localhost:33333/chatservice 的控制台应用程序中,使用带有以下绑定配置的 netTcpBinding

在我的 WPF 客户端中,我使用 svcutil 实现了服务代理,如下所示:

IChatServiceCallback

聊天服务

IChatService频道

和聊天代理

在主应用程序中使用客户端配置:

好的,除了出于某种原因我在运行以下代码以连接到服务时遇到错误之外,一切都很好,代码是:

我得到的错误是:

远程端点请求的确认地址与应用程序消息的地址不同。无法打开通道,因为不支持此操作。确保用于创建通道的端点地址与设置远程端点的地址相同。

我的问题(对于很长的帖子感到抱歉,但我完全坚持这一点)只是是否有其他人遇到过这个问题并且可以指出我的答案吗?

编辑:我已更新以包含来自服务器和客户端的完整 serviceModel 部分,还更新了 ProxySingleton 以显示它确实实现了回调接口

0 投票
0 回答
262 浏览

c# - 双工 WCF net.tcp 服务为我的客户端处理了对象异常

我实现了一个用于与 WCF 聊天的客户端-服务器应用程序。我有一个广播回调。它工作正常,直到我改变了一些功能。我正在使用我的数据集修复数据。它在我的服务器上初始化并被使用。我实现了一个 XML 解析器机制,然后我收到了这样的错误:

无法访问已处置的对象。对象名称:“System.ServiceModel.InstanceContext”。

我正在使用我的服务:

然后我只打开 this._client 一次,我在每次调用时都使用这个对象。(我不会随时关闭这个对象。)

如果我在每次通话之前打开然后关闭它,那么它就可以工作。但在这种情况下,我的回调函数不起作用。而且我不能广播。所以我无法关闭我的客户对象。

你有关于这个错误的更多信息吗?或者有什么修复建议?

我的服务代码:

0 投票
0 回答
196 浏览

c# - 无法让 WCF Duplex ChannelFactory 正确出错

给定一个有效的 Binding 和 EndpointAddress,我有一个 WCF Duplex ChannelFactory,如下所示:

打开的事件触发没有问题,但是当我关闭我的服务时,错误的事件没有触发。如何让 Faulted 事件触发?

0 投票
2 回答
1110 浏览

c# - WCF 服务无法捕获客户端的崩溃

我创建了一个使用 NetTCP 绑定的 WCF 服务。

我的服务被客户端访问,保存它的回调通道并在以后使用它来调用客户端(它是一个持久的 tcp 连接)。一切正常,但如果我决定突然终止客户端 - 我会得到一个我无法捕获的 SocketException(“现有连接被远程主机强行关闭”)。

我已经尝试了什么?

  1. 我已经在使用回调通道的每个方法中添加了 try-catch 子句,甚至在上层 - 启动我的服务的 WCFHost。

  2. 我尝试获取通道和回调通道并添加一个处理通道故障事件的方法:

    /li>

简而言之,我正在尝试处理客户端抛出的异常 - 在服务器端。

0 投票
1 回答
1186 浏览

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:

enter image description here

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:

enter image description here

enter image description here

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.

0 投票
1 回答
156 浏览

.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 上,我已经定义了服务和回调接口。

我在这里有几个问题:

  1. 如何设置 AppB 使其 IP 取决于它正在运行的机器?我不能使用不同的 App.config 文件构建 AppB 10-20 次,每次都说明不同的主机基地址。
  2. 如何设置 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()。除了我编写的代码之外,似乎还有一些东西正在尝试启动服务。