SignalR - Websockets - 超出缓冲区长度

问题描述 投票:0回答:2

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

    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服务或建立与其他websockets的连接以及处理异步提要。

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

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

如果不; signalR支持消息分块吗?或者我需要实施自己的解决方案吗?

c# javascript asp.net .net signalr
2个回答
1
投票

一个老问题,但这篇文章(这对我来说没有解决问题)来自Google的争论,之后我从这里找到了一个有效的解决方案:https://stackoverflow.com/a/39854957/3535681

所以这里简要介绍了上面链接的答案。

您可以通过将MaxIncomingWebSocketMessageSize设置为null来在Startup.cs中添加一条使消息大小为“无限”的行:

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

在我的情况下导致缓冲区长度超过错误的消息我们刚刚超过64K所以我只将MaxIncomingWebSocketMessageSize加倍到128K。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.