在 WCF中, maxConcurrentSessions默认为 10,因此限制服务器拥有超过 10 个打开的 TCP 连接。
为什么会这样?
对于具有“少数”(或两个)客户端但由于向客户端发送事件而需要为每个客户端保持打开的 netTcpBinding 的服务器,仅将其设置为非常高的值对我来说是否安全?
在 WCF中, maxConcurrentSessions默认为 10,因此限制服务器拥有超过 10 个打开的 TCP 连接。
为什么会这样?
对于具有“少数”(或两个)客户端但由于向客户端发送事件而需要为每个客户端保持打开的 netTcpBinding 的服务器,仅将其设置为非常高的值对我来说是否安全?
我假设您的实例模式是每会话。如果需要,您可以将此值设置为 Int32.Max。但是,最好详细了解 WCF 限制概念。
该值非常低以防止 DOS 攻击,因为 WCF 团队希望服务“默认安全”。
这是一本好书,请在此处查看此博客文章
请注意,这些值非常低……远低于许多人希望的值。WCF 团队的想法是,他们希望 WCF “默认安全”并减少针对您的服务发起的 DOS 攻击的变化。这个想法可能听起来很棒,但在实践中它会导致重大问题。
事实上,如果您使用支持会话的 WsHttpBinding 之类的绑定,您几乎肯定会遇到这些问题。这是为什么?默认会话数为 10,这首先显示意味着 10 个用户可以同时访问您的服务。但是,WCF 会话不是 Web 会话。与由服务器管理并通常使用 http cookie 跟踪的 Web 会话不同,WCF 会话由客户端代理启动,并且在超时或客户端发送显式请求以放弃会话之前不会结束。事情是这样的,因为每个代理实例都会启动它自己的会话,因此一次发出几个请求的用户可能会同时使用多个会话。现在你可能会认为如果你不这样做你是安全的 没有做这种事情的多线程代码......但这并不完全正确。因为用户必须向服务器发出明确的请求以取消他的会话,所以您可能会意外地打开会话。一直在使用 ASMX 服务的人,往往没有意识到他们需要关闭他们的代理对象,而少数意识到需要关闭对象的人经常错误地将它们视为一次性对象,从而导致会话保持打开状态。请记住,默认会话限制为 10,这意味着如果您在相对较短的时间内使用 WsHttpBinding 对服务进行 10 次调用,您最终可能会锁定您的服务,直到会话过期。因为用户必须向服务器发出明确的请求以取消他的会话,所以您可能会意外地打开会话。一直在使用 ASMX 服务的人,往往没有意识到他们需要关闭他们的代理对象,而少数意识到需要关闭对象的人经常错误地将它们视为一次性对象,从而导致会话保持打开状态。请记住,默认会话限制为 10,这意味着如果您在相对较短的时间内使用 WsHttpBinding 对服务进行 10 次调用,您最终可能会锁定您的服务,直到会话过期。因为用户必须向服务器发出明确的请求以取消他的会话,所以您可能会意外地打开会话。一直在使用 ASMX 服务的人,往往没有意识到他们需要关闭他们的代理对象,而少数意识到需要关闭对象的人经常错误地将它们视为一次性对象,从而导致会话保持打开状态。请记住,默认会话限制为 10,这意味着如果您在相对较短的时间内使用 WsHttpBinding 对服务进行 10 次调用,您最终可能会锁定您的服务,直到会话过期。一直在使用 ASMX 服务的人通常没有意识到他们需要关闭代理对象,而少数意识到需要关闭代理对象的人经常会错误地将它们视为一次性对象,从而导致会话保持打开状态。请记住,默认会话限制为 10,这意味着如果您在相对较短的时间内使用 WsHttpBinding 对服务进行 10 次调用,您最终可能会锁定您的服务,直到会话过期。一直在使用 ASMX 服务的人,往往没有意识到他们需要关闭他们的代理对象,而少数意识到需要关闭对象的人经常错误地将它们视为一次性对象,从而导致会话保持打开状态。请记住,默认会话限制为 10,这意味着如果您在相对较短的时间内使用 WsHttpBinding 对服务进行 10 次调用,您最终可能会锁定您的服务,直到会话过期。
WCF 团队在这里做出的决定可能令人困惑。为了限制攻击者对您的服务发起 DOS 攻击的能力,他们使对您的服务执行 DOS 攻击变得更加容易。您不再需要资源来向服务器发出请求以使其不再响应,您只需进行少量调用即可,而无需明确请求连接以关闭并最大化会话计数。除非将此值设置得非常高,否则您将面临服务器拒绝接受任何传入连接的风险,尽管事实上它正在以零 CPU 使用率冷却。
您可以将其设置得更高 - 只要您的服务器有资源来处理请求。它默认为 10,因为这将轻松击败对您的服务的任何拒绝服务攻击。如果您有一台功能强大的服务器专门用于此单一服务,您可以根据需要将其设置为 10,000。没有一个神奇的数字可以用于此 - 您需要平衡一方面的需求和另一方面的服务器资源,这个最大并发会话数有助于防止崩溃!