我配置了信号器诊断程序来帮助跟踪从客户端到服务器的未到达服务器的消息......我发现了以下异常细节,这几乎是我怀疑发生的事情。
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支持消息分块吗?或者我需要实现自己的解决方案吗?
答案 0 :(得分: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; } }
在我的情况下,导致Buffer Lenght Exceede错误的消息刚好超过64K,因此我只将MaxIncomingWebSocketMessageSize翻了一番,达到128K。
答案 1 :(得分:0)
我怀疑需要一个解决方法,所以我实现了一个相当基本的分块机制来防止超出缓冲区限制的消息大小。