问题标签 [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.
wcf - WCF 中的可靠会话和发送超时
我正在开发一个 WCF 应用程序。在 app.config 文件中,我使用了启用的可靠会话。我的 sendTimeOut 绑定设置为 10 分钟。在测试应用程序时,我遇到了一个问题,比如我正在断开网络连接,并且我正在尝试连接到远程系统,因为我启用了可靠会话,代理它等待 10 分钟,然后只抛出异常。是否有任何属性/属性可以帮助我检测 app.config 文件中可用的网络连接或作为可靠会话的一部分?
.net - WCF - Binding.ReceiveTimeout & ReliableSession.InactivityTimeout
我正在尝试制作一个使用回调客户端的 WCF 服务。只要有连接(互联网,网络)并且客户端或通道没有明确关闭通道,我希望通道保持打开状态。
为了保持通道打开(即使没有活动),我找到了 WCF 支持的可靠会话。我看到通过使用可靠会话,需要考虑两个计时器:theBinding.ReceiveTimeout
和ReliableSession.InactivityTimeout
.
在互联网上搜索后,我仍然无法确切了解这两者是如何协同工作的。我知道如果两者中的任何一个超时,连接就会进入故障状态。
我的第一个问题:启用可靠会话时究竟会发生什么?
我的第二个问题:这里,为什么msdn会这样说?
由于如果任一非活动计时器触发,连接就会断开,因此一旦 InactivityTimeout 大于 ReceiveTimeout 就增加它没有任何效果。这两个超时的默认值都是 10 分钟,因此在使用可靠会话时,您始终必须同时增加这两个超时。
wcf - WCF、Windows 应用商店应用和可靠会话
是否可以在 Windows 应用商店应用程序中使用 WCF 可靠会话?
我正在使用 C# 在 Visual Studio 2012 Professional 中编写一个 Windows 应用商店应用程序。我正在尝试使用会话访问 WCF 服务。我不能使用 WSHttpBinding,因为 Windows 应用商店应用程序不支持它。我发现 Windows 应用商店应用程序确实支持 NetHTTPBinding,它支持可靠会话,但我似乎无法访问绑定的 ReliableSession 属性,也无法访问将“bool可靠会话启用”作为参数的构造函数。
是否有任何支持 Windows 应用商店应用会话的绑定?
-乔
c# - 当服务器处于繁重的 CPU 负载或线程池繁忙时,WCF 可靠会话故障
当服务器处于繁重的 CPU 负载或线程池繁忙时,WCF 可靠会话故障
WCF 可靠会话中似乎存在设计缺陷,当服务器处于高 CPU 负载(80-100% 范围)或没有立即可用的 IO 线程池线程时,该缺陷会阻止基础结构保持活动消息的发布或接受来处理消息。由于可靠的会话不活动超时,症状表现为明显的随机通道中止。然而,中止逻辑似乎以更高的优先级或通过不同的机制运行,因为即使保持活动定时器无法运行,中止定时器似乎也会触发。
深入研究参考源,看来 ChannelReliableSession 使用 InterruptableTimer 类来处理 inactivityTimer。作为响应,它触发由 ReliableOutputSessionChannel 设置的 PollingCallback,它创建一个 ACKRequestedMessage 并将其发送到远程端点。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,并且通道可能出现故障。
wcf - 无论配置的超时如何,WCF 可靠会话故障
我正在尝试使用 WCF 可靠会话来启用从服务到客户端的回调。这个回调通道需要无限期打开。
在某些 .NET 版本中似乎存在一个错误,使可靠会话过早地出现故障。应该没问题,只需将 inactivityTimeout 和 receiveTimeout 设置为足够高的值(例如TimeSpan.MaxValue
)。
但是无论我如何配置我的客户端和服务,通道在 10 分钟后仍然会出现故障,无论我设置的超时值如何。
如果没有我的配置,这个问题将是不完整的,所以这里是:
因此,正如您所看到的,所有超时都配置为高于 10 分钟的值,并且在没有任何服务调用的情况下,通道仍然会在 10 分钟后准确地出现故障。我该如何规避这个?据我了解,可靠会话(除其他外)正是用于此目的:保持通道活动并防止它们发生故障(通过发送基础设施保持活动数据包——至少在没有上述错误的最新 .NET 版本中)。
.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,可以解决问题,但并非总是可行。
有谁知道为什么这个程序会泄漏句柄?
wcf - 在什么情况下推荐可靠的会话?
简而言之,如果我没记错的话,当我想确保包按顺序发送时使用会话,并且能够使用会话需要可靠的连接。
但我怀疑什么样的应用程序需要它?在我的例子中是一个简单的应用程序,其中客户端从数据库请求服务数据,服务从数据库中获取数据并将结果发送给客户端。客户端也可以请求从数据库中添加、修改或删除数据。在这种情况下,我是否需要可靠的连接和会话?
谢谢。
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 一起使用?
提前致谢!
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
。
我也尝试将MaxConnections
and ListenBackLog
(on NetTcpBinding
) 设置为它们的最大值。它没有改变任何东西——据我所知。
编辑 2
检查 WCF 跟踪它告诉我(德语消息,因此是粗略的翻译)可靠消息传输窗口中没有可用空间 - 然后我得到的只是超时,因为不再发送消息。
那里发生了什么事?可靠的消息传递是否有可能使自己感到困惑?
wcf - WCF 服务器上的“有序”标志在可靠会话中的作用是什么?
我了解客户端的“有序”标志是做什么的......但是服务器端配置有什么作用吗?我知道无论“ordered”标志设置为“true”还是“false”,通讯都可以正常工作。它是服务器端的冗余设置吗?