【问题标题】:SignalR - Websockets - Buffer Length ExceededSignalR - Websockets - 超出缓冲区长度
【发布时间】:2013-12-04 12:11:49
【问题描述】:

我配置了信号器诊断以帮助跟踪从客户端到服务器但未到达服务器的消息...我发现了以下异常详细信息,这几乎是我怀疑发生的事情。

    SignalR.Transports.WebSocketTransport Error: 0 : OnError(08af5ad0-d63d-42a3-8e00-3c109da3be6b, System.InvalidOperationException: Buffer length exceeded
   at Microsoft.AspNet.SignalR.Infrastructure.ByteBuffer.Append(Byte[] segment)
   at Microsoft.AspNet.SignalR.WebSockets.WebSocketMessageReader.<ReadMessageAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler.<ProcessWebSocketRequestAsync>d__8.MoveNext())

来自 packages.config;这是 SignalR 版本详情

  <package id="Microsoft.AspNet.SignalR" version="1.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.Core" version="1.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.JS" version="1.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.Owin" version="1.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.SystemWeb" version="1.1.2" targetFramework="net45" />

我使用 SignalR 作为 javascript 库测试框架。 SignalR 允许服务器调用客户端 js lib 函数,这些函数涉及调用其他 web 服务或建立与其他 websocket 的连接以及处理异步提要。

我遇到了一个特定的 js lib 函数,它调用了一个 json webservice,并且响应大到超过了 signalR 内部缓冲区。

那么,最大缓冲区长度是多少?是否可配置?

如果没有; signalR 支持消息分块吗?还是我需要实施自己的解决方案?

【问题讨论】:

  • 不,它现在不支持任何分块,我们也不希望通过 SignalR 发送的消息有这么大(这是一个安全问题,因为内容缓冲在内存中)。您要发送大于 4MB 的内容吗?
  • 对 GetAccountStatement Web 服务调用的响应...基本上是一个非常大的帐户过帐集合。但是自从我发布了这个问题;我实现了一个简单的分块机制作为解决方法。只需一次将集合中的一项从客户端发送到服务器,然后让服务器重新构建集合。我预计我需要一个解决方法。感谢您的回复。
  • @dfowler 等一下;你说大于4MB???我严重怀疑消息响应是否会超过 4MB。您确定我使用的 SignalR 版本的最大消息大小或最大缓冲区大小为 4MB?有没有一种方法可以测量/记录邮件大小?
  • 嗯,好的。这是有道理的。作为一个学术问题;我认为默认值是不可配置的?

标签: c# javascript asp.net .net signalr


【解决方案1】:

一个老问题,但在我从这里找到一个可行的解决方案之前,这篇文章(它并没有为我解决问题)来自谷歌的债务:https://stackoverflow.com/a/39854957/3535681

所以这里简要介绍一下上面链接中的答案对我有什么帮助。

您可以在您的 通过将 MaxIncomingWebSocketMessageSize 设置为 null 来启动.cs:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
    app.MapSignalR();
    GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;
    }
}

在我的例子中,导致 Buffer Lenght Exceede 错误的消息刚刚超过 64K,所以我只将 MaxIncomingWebSocketMessageSize 翻倍到 128K。

【讨论】:

    【解决方案2】:

    我怀疑需要一种解决方法,因此我实施了一个相当基本的分块机制来防止消息大小超过缓冲区限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多