问题标签 [reliablesession]

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 回答
402 浏览

wcf - WCF 中的可靠会话和发送超时

我正在开发一个 WCF 应用程序。在 app.config 文件中,我使用了启用的可靠会话。我的 sendTimeOut 绑定设置为 10 分钟。在测试应用程序时,我遇到了一个问题,比如我正在断开网络连接,并且我正在尝试连接到远程系统,因为我启用了可靠会话,代理它等待 10 分钟,然后只抛出异常。是否有任何属性/属性可以帮助我检测 app.config 文件中可用的网络连接或作为可靠会话的一部分?

0 投票
1 回答
6350 浏览

.net - WCF - Binding.ReceiveTimeout & ReliableSession.InactivityTimeout

我正在尝试制作一个使用回调客户端的 WCF 服务。只要有连接(互联网,网络)并且客户端或通道没有明确关闭通道,我希望通道保持打开状态。

为了保持通道打开(即使没有活动),我找到了 WCF 支持的可靠会话。我看到通过使用可靠会话,需要考虑两个计时器:theBinding.ReceiveTimeoutReliableSession.InactivityTimeout.

在互联网上搜索后,我仍然无法确切了解这两者是如何协同工作的。我知道如果两者中的任何一个超时,连接就会进入故障状态。

我的第一个问题:启用可靠会话时究竟会发生什么?

我的第二个问题:这里,为什么msdn会这样说?

由于如果任一非活动计时器触发,连接就会断开,因此一旦 InactivityTimeout 大于 ReceiveTimeout 就增加它没有任何效果。这两个超时的默认值都是 10 分钟,因此在使用可靠会话时,您始终必须同时增加这两个超时。

0 投票
1 回答
499 浏览

wcf - WCF、Windows 应用商店应用和可靠会话

是否可以在 Windows 应用商店应用程序中使用 WCF 可靠会话?

我正在使用 C# 在 Visual Studio 2012 Professional 中编写一个 Windows 应用商店应用程序。我正在尝试使用会话访问 WCF 服务。我不能使用 WSHttpBinding,因为 Windows 应用商店应用程序不支持它。我发现 Windows 应用商店应用程序确实支持 NetHTTPBinding,它支持可靠会话,但我似乎无法访问绑定的 ReliableSession 属性,也无法访问将“bool可靠会话启用”作为参数的构造函数。

是否有任何支持 Windows 应用商店应用会话的绑定?

-乔

0 投票
1 回答
1016 浏览

c# - 当服务器处于繁重的 CPU 负载或线程池繁忙时,WCF 可靠会话故障

当服务器处于繁重的 CPU 负载或线程池繁忙时,WCF 可靠会话故障

WCF 可靠会话中似乎存在设计缺陷,当服务器处于高 CPU 负载(80-100% 范围)或没有立即可用的 IO 线程池线程时,该缺陷会阻止基础结构保持活动消息的发布或接受来处理消息。由于可靠的会话不活动超时,症状表现为明显的随机通道中止。然而,中止逻辑似乎以更高的优先级或通过不同的机制运行,因为即使保持活动定时器无法运行,中止定时器似乎也会触发。

深入研究参考源,看来 ChannelReliableSession 使用 InterruptableTimer 类来处理 inactivityTimer。作为响应,它触发由 ReliableOutputSessionChannel 设置的 PollingCallback,它创建一个 ACK​​RequestedMessage 并将其发送到远程端点。InactivityTimer 使用 WCF 内部的 IOThreadTimer/IOThreadScheduler 来调度自己。这取决于一个可用的(非繁忙的)IO ThreadPool 线程来为定时器提供服务。如果 CPU 负载很高,则线程池似乎不会产生新线程。因此,如果有多个线程正在执行(在我的 4 核机器上似乎是 8 个线程;在 15 秒 inactivityTimeout 7 将中止并失败),则没有线程可用于发送 keep-alive。但是,如果您将客户端上的可靠会话不活动超时修改为比服务器更长,即使在这些情况下,服务器仍将单方面中止通道,因为它希望在更短的时间内收到消息。因此,中止逻辑似乎以更高的优先级运行,或者向其中一个正在执行的线程抛出异常(不确定是哪个);我预计服务器上的中止会由于 CPU 高而延迟,并且客户端的超时时间较长最终会命中,但事实并非如此。如果 CPU 负载较低,那么即使并发调用需要 30-90 秒才能返回,这种完全相同的场景也可以正常工作。

您的 InstanceMode 是什么、最大并发连接、会话或实例是什么、其他任何超时值是什么都无关紧要(recieveTimeout 必须大于 inactivityTimeout 除外)。这完全是WCF实现的设计缺陷;它应该使用隔离的高优先级或实时线程来为保持活动消息提供服务,因此不会产生虚假的中止。

简短的版本是:只要 CPU 负载保持在低水平,我可以发出 1000 个需要 60 秒才能完成的并发请求和 15 秒的可靠会话不活动超时,没有问题。一旦 CPU 负载变重,调用将随机开始中止,包括不占用任何 CPU 时间的调用或空闲等待使用的双工会话如果传入的调用也增加了 CPU 负载,那么服务将进入死亡螺旋,因为执行时间被浪费在保证中止的请求上,而其他请求则位于入站队列中。在停止所有请求、所有运行中的线程完成并且 CPU 负载下降之前,该服务无法恢复到健康状态。这种行为似乎使 Reliable Sessions 成为最不可靠的通信机制之一。

同样的行为也适用于客户端;在这种情况下,WCF 客户端可能会受到盒子上其他进程的支配,但在高 CPU 负载下,它将随机中止可靠会话,除非所有操作的完成时间少于 inactivityTimeout,但如果您不发出新的调用很快,WCF 可能仍然无法发送 keep-alive,并且通道可能出现故障。

0 投票
1 回答
861 浏览

wcf - 无论配置的超时如何,WCF 可靠会话故障

我正在尝试使用 WCF 可靠会话来启用从服务到客户端的回调。这个回调通道需要无限期打开。

在某些 .NET 版本中似乎存在一个错误,使可靠会话过早地出现故障。应该没问题,只需将 inactivityTimeout 和 receiveTimeout 设置为足够高的值(例如TimeSpan.MaxValue)。

但是无论我如何配置我的客户端和服务,通道在 10 分钟后仍然会出现故障,无论我设置的超时值如何。

如果没有我的配置,这个问题将是不完整的,所以这里是:


因此,正如您所看到的,所有超时都配置为高于 10 分钟的值,并且在没有任何服务调用的情况下,通道仍然会在 10 分钟后准确地出现故障。我该如何规避这个?据我了解,可靠会话(除其他外)正是用于此目的:保持通道活动并防止它们发生故障(通过发送基础设施保持活动数据包——至少在没有上述错误的最新 .NET 版本中)。

0 投票
0 回答
563 浏览

.net - WCF ReliableSession:在框架 4.5 中处理泄漏?

在某些服务器上安装 4.5 运行时后,我们遇到了许多与 winsock 相关的错误。当在 .Net 4.5 运行时(在 4.0 上不可重现)上使用带有 ReliableSessions 的 WCF 时,我将问题追溯到 \Device\Afd 的句柄泄漏。

我编写了一个测试程序来隔离/证明问题。

假设一个非常虚拟的 WCF 服务和客户端(可以从 VS 生成):

它是托管和消费的。

测试程序的输出是:

评论:

  • 我知道我应该做更好的错误处理,因为 Close() 可以抛出,但在这种情况下它不会,所以我更喜欢在这里粘贴更少的代码。
  • 在这里,我记录了所有句柄(不仅是 \Device\Afd)的句柄计数。这使得快速测试变得更容易,但我使用 sysinternals 的 handle.exe 进行了许多检查以验证句柄的名称/类型
  • 句柄是客户端泄露的,而不是服务泄露的(至少在关闭服务主机后它们被正确清理)。

变化:

  • 将 Proxy.Close() 更改为 Abort() 时,其中的所有句柄都会正确释放(但是服务很难关闭 - 正如预期的那样)
  • 创建通道通过IClientChannel proxy = ChannelFactory<IMyService>.CreateChannel(binding, address) as IClientChannel给出相同的结果
  • 通过 channelfactory 实例创建通道时,句柄被正确释放:IClientChannel proxy = new ChannelFactory<IMyService>(binding, address).CreateChannel() as IClientChannel
  • 将 ClientBase<>.CacheSetting 设置为 AlwaysOn,可以解决问题,但并非总是可行。

有谁知道为什么这个程序会泄漏句柄?

0 投票
1 回答
36 浏览

wcf - 在什么情况下推荐可靠的会话?

简而言之,如果我没记错的话,当我想确保包按顺序发送时使用会话,并且能够使用会话需要可靠的连接。

但我怀疑什么样的应用程序需要它?在我的例子中是一个简单的应用程序,其中客户端从数据库请求服务数据,服务从数据库中获取数据并将结果发送给客户端。客户端也可以请求从数据库中添加、修改或删除数据。在这种情况下,我是否需要可靠的连接和会话?

谢谢。

0 投票
0 回答
95 浏览

wcf - 通过 wsHttpBinding 进行 WCF SOAP 通信

我有一个使用自定义绑定托管在 IIS 中的 WCF 服务,这似乎是一个 wsHttpBinding 并打开了“可靠会话”和“传输安全”。从 Visual Studio 自动生成的客户端代码一切正常。

现在我需要编写一些文档来描述交换的确切字符串。特别是对于完全不熟悉 Visual Studio 或 Windows 的客户。

弄清楚我的 WCF 服务和客户端之间的 SOAP 通信并不难。我已将一些 System.Diagnostics-blocks 添加到客户端配置文件中,并将每条消息记录到一个文件中。到目前为止一切都很好。

现在,我尝试像非 VS 客户那样使用 HttpWebRequest 测试服务,从我的日志中发送 SOAP 信封。麻烦就从这里开始了。

  • 我发送的第一个信封是 CreateSequence
  • 我从服务器获得 CreateSequenceResponse
  • 我想从界面执行特定功能
  • 从现在开始,服务器以 500 回答 - 内部错误

问题是,我从日志中准确地发送了信封,中间似乎没有任何东西,比如任何 ACK 或其他东西。

有没有人遇到过类似的问题?我是否误解了某些东西,并且可靠会话设置不能与 HttpWebRequest 一起使用?

提前致谢!

0 投票
3 回答
697 浏览

c# - NetTcpBinding (WCF) 中的 ReliableSession 出现意外故障

我有一个客户端服务器应用程序。我的场景:

  • .Net 框架 4.6.1
  • 启用超线程的四核 i7 机器
  • 服务器 CPU 负载 20 - 70 %
  • 网络负载 < 5% (GBit NIC)
  • 100 个用户
  • 30 个服务(一些管理服务,每种数据类型的一些通用服务)正在运行,每个用户都连接到所有服务
  • NetTcpBinding(启用压缩)
  • 已启用 ReliableSession
  • 每秒我都会触发(服务器端)一个更新通知,并且所有客户端大约从服务器加载。100 KB
  • 另外一个心跳正在运行(用于测试 15 秒间隔),它只是以 UTC 格式返回服务器时间

有时 WCF 连接会更改为故障状态。通常,当这种情况发生时,服务器根本没有上游网络。我确实写了一个内存转储,并且能够看到很多 WCF 线程正在等待一些WaitQueue. 调用栈是:

我确实调整了设置,似乎情况有所缓解 - 现在出现故障的客户更少了。我的设置:

  • ReliableSession.InactivityTimeout: 01:30:00
  • ReliableSession.Enabled:真
  • ReliableSession.Ordered:假
  • ReliableSession.FlowControlEnabled: 假
  • ReliableSession.MaxTransferWindowSize: 4096
  • ReliableSession.MaxPendingChannels:16384
  • MaxReceivedMessageSize: 1073741824
  • ReaderQuotas.MaxStringContentLength:8388608
  • ReaderQuotas.MaxArrayLength: 1073741824

我被困住了。为什么所有呼叫都试图在 中等待WaitQueue一些TransmissionStrategy?我不关心消息被乱序发送(我自己会处理)。我已经在考虑禁用可靠消息传递,但该应用程序已在全球公司网络中使用。我需要知道我的消息已送达。

有什么想法可以教 WCF 只发送消息而不关心其他任何事情吗?

编辑

服务限制的值设置为Int32.MaxValue

我也尝试将MaxConnectionsand ListenBackLog(on NetTcpBinding) 设置为它们的最大值。它没有改变任何东西——据我所知。

编辑 2

检查 WCF 跟踪它告诉我(德语消息,因此是粗略的翻译)可靠消息传输窗口中没有可用空间 - 然后我得到的只是超时,因为不再发送消息。

那里发生了什么事?可靠的消息传递是否有可能使自己感到困惑?

0 投票
1 回答
45 浏览

wcf - WCF 服务器上的“有序”标志在可靠会话中的作用是什么?

我了解客户端的“有序”标志是做什么的......但是服务器端配置有什么作用吗?我知道无论“ordered”标志设置为“true”还是“false”,通讯都可以正常工作。它是服务器端的冗余设置吗?