#c# #asp.net-core #signalr
#c# #asp.net-ядро #signalr
Вопрос:
Я работаю на сервере с использованием SignalR и Asp.Net Ядро 2.2.
У меня есть функция на стороне сервера, которая может получать 3 параметра, 2 из этих параметров являются необязательными. Это не поддерживается в SignalR. Но чтобы противостоять этому, я создал класс, который будет действовать как пользовательский тип данных.
https://github.com/aspnet/AspNetCore/issues/8853
Но когда я вызываю функцию через клиент, я получаю эту ошибку:
Failed to invoke hub method 'CreateRoom'.
System.IO.InvalidDataException: Error binding arguments. Make sure that the types of the provided values match the types of the hub method being invoked. ---> Newtonsoft.Json.JsonSerializationException: Error converting value 2 to type 'GameServer.Classes.CreateParams'. Path '[0]', line 1, position 15. ---> System.ArgumentException: Could not cast or convert from System.Int64 to GameServer.Classes.CreateParams.
at Newtonsoft.Json.Utilities.ConvertUtils.EnsureTypeAssignable(Object value, Type initialType, Type targetType) in /_/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs:line 616
at Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(Object initialValue, CultureInfo culture, Type targetType) in /_/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs:line 587
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) in /_/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:line 982
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) in /_/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:line 989
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) in /_/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:line 167
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) in /_/Src/Newtonsoft.Json/JsonSerializer.cs:line 907
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType, JsonSerializer jsonSerializer) in /_/Src/Newtonsoft.Json/Linq/JToken.cs:line 2070
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.BindArguments(JArray args, IReadOnlyList`1 paramTypes)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.BindArguments(JArray args, IReadOnlyList`1 paramTypes)
at Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.ParseMessage(Utf8BufferTextReader textReader, IInvocationBinder binder)
Вот мой код.
Начало работы функции на стороне сервера.
GameHub.cs
public async Task CreateRoom(CreateParams data)
{
Log.Information("CreateRoom is called with Game: {0}, RoomName: {1}", data.Game, data.RoomName);
try
{
int _MaxUsers = 2;
if (data.MaxUsers != null)
{
if (data.MaxUsers <= 2)
{
_MaxUsers = 2;
}
else
{
_MaxUsers = (int)data.MaxUsers;
}
}
Пользовательский класс
CreateParams
public class CreateParams
{
public string Game { get; set; }
public string RoomName { get; set; }
public int? MaxUsers { get; set; }
}
Клиент
connection.invoke("CreateRoom", (gameType, lobbyName, maxUsers));
Я не знаю, почему это происходит.
Я надеюсь, что вы, ребята, сможете мне помочь.
Редактировать
Я попробовал то, что вы мне дали, но я получаю эту ошибку:
Source: System.Collections.Concurrent, Method: ThrowKeyNullException, Error: Value cannot be null.
Parameter name: key, Stack Trace: at System.Collections.Concurrent.ConcurrentDictionary`2.ThrowKeyNullException()
at System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(TKey key, TValueamp; value)
at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
at GameServer.Hubs.GameHub.CreateRoom(CreateParams data) in projectlocationGameServerGameServerHubsGameHub.cs:line 149
2019-04-15 14:34:50.504 02:00 [ERR] Failed to invoke hub method 'CreateRoom'.
System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Concurrent.ConcurrentDictionary`2.ThrowKeyNullException()
at System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(TKey key, TValueamp; value)
at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
at GameServer.Hubs.GameHub.CreateRoom(CreateParams data) in projectlocationGameHub.cs:line 149
at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.ExecuteHubMethod(ObjectMethodExecutor methodExecutor, THub hub, Object[] arguments)
at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.Invoke(HubMethodDescriptor descriptor, HubConnectionContext connection, HubMethodInvocationMessage hubMethodInvocationMessage, Boolean isStreamedInvocation)
Я зарегистрировал ответ, и все параметры равны нулю
Ответ №1:
Ваш клиент отправляет неправильные параметры. Вы отправляете gameType, lobbyName и maxUsers, но классу нужны Game, roomName, MaxUsers
const params={
Game: gameType,
RoomName: lobbyName,
MaxUsers: maxUsers
}
connection.invoke("CreateRoom", params);
должен решить это.
Ответ №2:
Создайте объект json на стороне клиента, как показано ниже:
const param={
gameType:gameType,
lobbyName: lobbyName,
maxUsers: maxUsers
}
И передайте этот объект для вызова метода следующим образом:
connection.invoke("CreateRoom", param);
Надеюсь, это поможет.
Комментарии:
1. Посмотрите на мое редактирование