【问题标题】:No exceptions thrown even when maxBufferSize value is smaller than the response message size in WCF即使 maxBufferSize 值小于 WCF 中的响应消息大小,也不会引发异常
【发布时间】:2009-12-12 03:45:26
【问题描述】:

我有一个将字节数组发送到客户端的 wcf 操作。

我打算发送的字节数组的最大大小是 2mb。因此,我在服务器上使用 transfermode=buffered 将 basichttpbinding 上的 maxbuffersize 和 maxreceivedmessagesize 设置为 2097152 (2 mb)。

尽管有这些设置,但如果我传输 17mb 文件,不会引发缓冲区溢出异常?

谢谢。

【问题讨论】:

    标签: wcf wcf-binding


    【解决方案1】:

    更新:
    我对 WCF 中的缓冲以及各种值的影响的理解是错误的。请查看此MSDN thread 和此related blog post,了解 WCF 缓冲区管理的来龙去脉。

    但是,我仍然找不到关于如何限制服务器上的缓冲区的明确答案。据我了解,如果您在服务器端限制maxBufferPoolSize(所有缓冲区池的总数)和maxBufferSize(单个缓冲区的最大大小),您应该能够实现您想要的做。

    因此,在您的情况下,您应该在服务器上将maxBufferSize 设置为 2mb,并将maxBufferPoolSize 设置为 2mb 或更多,也在服务器上。在客户端上,将maxReceivedMessageSize 也设置为 2mb。

    【讨论】:

    • 当我向客户端发送一个 17mb 的文件时它可以工作。客户端的 maxreceivedmessagesize 和 maxbuffersize 设置为 2gb。如果我在客户端将这些值设置为 2mb,我会得到一个异常,因为客户端无法接收 17mb 文件,但这个想法不是限制客户端接收大消息。这个想法是控制服务器上的缓冲区大小。
    • 从我读到的 - 默认情况下,WCF 以缓冲模式处理消息。这意味着消息的全部内容在发送之前或接收之后都存在于内存中。如何控制分配的内存?我以为我可以通过 maxbuffersize 属性来控制它,但显然不能?
    • 同意消息始终以缓冲模式完整组装。我的意图不是以我可以使用 chunkingchannel 的块的形式发送消息。在客户端上设置 2mb 不会停止服务器处理 17mb 文件。服务器仍在处理 17mb 文件(内存中的 17mb)并尝试将其发送给客户端,但客户端无法接收它,因为 maxrecievedmessagesize 设置为 2mb,因此在客户端而不是服务器上引发错误。
    • 这个想法是减少服务器上的内存消耗,即只向客户端发送最多 2 mb 的字节 []。如果大小> 2mb,我可以通过找出文件大小而不将文件发送给客户端来控制这一点。我希望 WCF 可以处理所有这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多