2013-12-04 3 views
0

Я сконфигурировал диагностику signalr, чтобы отслеживать сообщения с клиента на сервер, которые не доходили до сервера ... Я обнаружил следующую деталь исключения, которая в значительной степени была причиной того, что я подозревал.SignalR - Websockets - длина буфера превышена

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()) 

Из пакета .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 на стороне клиента, которые включают вызов других веб-сервисов или установление подключений к другим веб-сайтам и обработку асинхронных каналов.

Я столкнулся с одной конкретной функцией js lib, которая вызывает веб-службу json, и ответ достаточно велик, чтобы превышать внутренние буферы сигнала.

Итак, какова максимальная длина буфера? Это настраивается?

Если нет; поддерживает ли сигнальная поддержка сигнала? Или мне нужно будет реализовать собственное решение?

+1

Нет, он не поддерживает какой-либо chunking today, и мы не ожидаем, что сообщения, отправленные через SignalR, будут такими большими (это проблема безопасности, поскольку вещи буферизуются в памяти). Что вы отправляете, это> 4 МБ? – davidfowl

+0

Ответ на вызов веб-службы GetAccountStatement ... В основном очень большая коллекция проводок. Но так как я опубликовал вопрос; В качестве обходного пути я реализовал простой механизм chunking. Просто отправляя один элемент коллекции за раз от клиента к серверу и сервер перестраивает сбор. Я ожидал, что мне понадобится обходной путь. Спасибо за ответ. –

+0

@dfowler Держать; вы сказали, что больше 4 МБ ??? Я серьезно сомневаюсь, что ответ на сообщение будет превышать 4 МБ. Вы уверены, что для версии SignalR я использую максимальный размер сообщения или максимальный размер буфера 4 МБ? Есть ли способ, который я могу измерить/записать размеры сообщений? –

ответ

0

Я подозревал, что обходной путь был бы необходим, поэтому я применил довольно простой механизм квантования для защиты от размеров сообщений, превышающих пределы буфера.

Смежные вопросы