#c# #asp.net-core #serialization #signalr
#c# #asp.net-core #сериализация #signalr
Вопрос:
Я использую SignalR для потоковой передачи некоторых данных в реальном времени. Я могу подключиться к своему js-клиенту отлично, однако, как только я вызываю метод, я получаю сообщение об ошибке ниже, только когда я использую журналы отладки для SignalR (в противном случае он просто вызывает Error: Invocation canceled due to the underlying connection being closed.
invoke). Если я помещаю точки останова в концентратор, где вызывается метод, он проходит через него, но почему-то я все равно получаю эту скрытую ошибку.
dbug: Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher[1]
Received hub invocation: InvocationMessage { InvocationId: "0", Target: "WatchSimulations", Arguments: [ System.Collections.Generic.List`1[System.Guid] ], StreamIds: [ ] }.
Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher: Debug: Received hub invocation: InvocationMessage { InvocationId: "0", Target: "WatchSimulations", Arguments: [ System.Collections.Generic.List`1[System.Guid] ], StreamIds: [ ] }.
dbug: Microsoft.AspNetCore.SignalR.HubConnectionContext[6]
Microsoft.AspNetCore.SignalR.HubConnectionContext: Debug: Failed writing message. Aborting connection.
System.ArgumentNullException: Value cannot be null. (Parameter 'inputType')
at System.Text.Json.JsonSerializer.Serialize(Utf8JsonWriter writer, Object value, Type inputType, JsonSerializerOptions options)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteCompletionMessage(CompletionMessage message, Utf8JsonWriter writer)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteMessageCore(HubMessage message, IBufferWriter`1 stream)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteMessage(HubMessage message, IBufferWriter`1 output)
at Microsoft.AspNetCore.SignalR.HubConnectionContext.WriteCore(HubMessage message, CancellationToken cancellationToken)
Failed writing message. Aborting connection.
Microsoft.AspNetCore.SignalR.HubConnectionHandler: Debug: OnConnectedAsync ending.
System.ArgumentNullException: Value cannot be null. (Parameter 'inputType')
Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport: Debug: Waiting for the client to close the socket.
at System.Text.Json.JsonSerializer.Serialize(Utf8JsonWriter writer, Object value, Type inputType, JsonSerializerOptions options)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteCompletionMessage(CompletionMessage message, Utf8JsonWriter writer)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteMessageCore(HubMessage message, IBufferWriter`1 stream)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.WriteMessage(HubMessage message, IBufferWriter`1 output)
at Microsoft.AspNetCore.SignalR.HubConnectionContext.WriteCore(HubMessage message, CancellationToken cancellationToken)
dbug: Microsoft.AspNetCore.SignalR.HubConnectionHandler[6]
OnConnectedAsync ending.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport[7]
Waiting for the client to close the socket.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport[2]
Socket closed.
Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport: Debug: Socket closed.
Концентратор:
[Authorize]
public class ProgressHub : Hub<IProgressHub>
{
public Task WatchSimulations(List<Guid> simulationUids)
{
var tasks = new List<Task>();
simulationUids.ForEach(id =>
{
tasks.Add(
Groups.AddToGroupAsync(Context.ConnectionId, id.ToString())
);
});
return Task.WhenAll(tasks);
}
}
Я использую .NET Core 3.1 и @microsoft/signalr 5.0.0.
Кто-нибудь знает об этой проблеме?
Спасибо!
Ответ №1:
Эта ошибка может возникнуть, если вы ссылаетесь на System.Text.Json 5.0 из проекта 3.1. 3.1.11 будет содержать исправление для этого. На данный момент вы можете либо не обновлять System.Text.Json, обновить свое приложение до net5.0, либо переключиться на использование Newtonsoft.Json вместо System.Text.Json.
Комментарии:
1. Переключение на Newtonsoft. Json сработал! Спасибо!
2. Могу я спросить, как именно вы переходите на Newtonsoft? вызов system.text выполняется в самой библиотеке signalr, к которой я не уверен, как получить доступ.
3. docs.microsoft.com/aspnet/core/signalr/…
4. У меня это не работает. После обновления до 3.1.12 или даже добавления newstonsoft. Поддержка Json ничего не меняется. Все еще получаю System. Исключение ArgumentNullException: значение не может быть нулевым. (Параметр ‘inputType’). Сейчас я действительно в отчаянии.. @Бреннан? Есть идеи?