Blazor wasm 客户端-服务器通信
Blazor wasm client-server communication
我正在使用 Blazor WebAssembly 开发在线游戏,但我遇到了客户端-服务器通信问题。
我决定使用 SignalR(因为它已在服务器端 Blazor 上使用)但我遇到了一些问题。
我有相当复杂的对象架构 - 继承、嵌套对象、字典、二维数组等。我遵循了这个 tutorial 并且按预期发送了像字符串这样的简单消息,但是当我尝试发送我的带有所有字典和东西的复杂对象,它不再起作用了。我发现,它使用 JSON 格式发送消息(我说的对吗?),它根本不支持嵌套对象、二维数组等(而且我不会解析所有对象变成字符串或其他东西......)。然而,在服务器端 blazor 上,即使使用复杂的数据结构,通信也能完美运行,因为它使用了 websockets(再次强调,这是正确的吗?)。
有没有办法在 Blazor WebAssembly 中使用这种服务器端 blazor 通信?
或者您有什么建议作为客户端-服务器通信的最佳解决方案? (快速通信、嵌套对象支持、字典支持等...)
我读过 json、messagepacks、websockets。
非常感谢任何帮助 ;)
服务器集线器上的代码:
public async Task OnLogin(string gameId)
{
//gvars contains all information about game - list of players, items etc.
Gvars gvars = GetGameInfo();
Player player = CreateNewPlayer();
await Clients.All.SendAsync("ReceiveIdAndGameInfo", gvars, player.Id);
}
客户端代码:
public async Task Start()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/myhub"))
.Build();
hubConnection.On<Gvars, int>("ReceiveIdAndGameInfo", (gv, id) =>
{
ReceiveNewId(gv, id);
});
await hubConnection.StartAsync();
await hubConnection.SendAsync("OnLogin");
}
private void ReceiveNewId(Gvars gvars, int id)
{
this.id = id;
this.gvars = gvars;
StateHasChanged();
}
将 SIgnalR 用于 Web 程序集应用程序,让我觉得有点倒退。
SignalR 是一个 javascript 库,应用程序必须通过 JSinterop 写入数据。
这正是服务器端 blazor 应用程序所需要的,但对于 Web 程序集,编写 C# class 并使用 HttpClient class 或 ClientWebSocket [=14= 会更容易]],它会做同样的事情,但在网络程序集内。
我正在使用 Blazor WebAssembly 开发在线游戏,但我遇到了客户端-服务器通信问题。
我决定使用 SignalR(因为它已在服务器端 Blazor 上使用)但我遇到了一些问题。
我有相当复杂的对象架构 - 继承、嵌套对象、字典、二维数组等。我遵循了这个 tutorial 并且按预期发送了像字符串这样的简单消息,但是当我尝试发送我的带有所有字典和东西的复杂对象,它不再起作用了。我发现,它使用 JSON 格式发送消息(我说的对吗?),它根本不支持嵌套对象、二维数组等(而且我不会解析所有对象变成字符串或其他东西......)。然而,在服务器端 blazor 上,即使使用复杂的数据结构,通信也能完美运行,因为它使用了 websockets(再次强调,这是正确的吗?)。 有没有办法在 Blazor WebAssembly 中使用这种服务器端 blazor 通信? 或者您有什么建议作为客户端-服务器通信的最佳解决方案? (快速通信、嵌套对象支持、字典支持等...) 我读过 json、messagepacks、websockets。 非常感谢任何帮助 ;)
服务器集线器上的代码:
public async Task OnLogin(string gameId)
{
//gvars contains all information about game - list of players, items etc.
Gvars gvars = GetGameInfo();
Player player = CreateNewPlayer();
await Clients.All.SendAsync("ReceiveIdAndGameInfo", gvars, player.Id);
}
客户端代码:
public async Task Start()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/myhub"))
.Build();
hubConnection.On<Gvars, int>("ReceiveIdAndGameInfo", (gv, id) =>
{
ReceiveNewId(gv, id);
});
await hubConnection.StartAsync();
await hubConnection.SendAsync("OnLogin");
}
private void ReceiveNewId(Gvars gvars, int id)
{
this.id = id;
this.gvars = gvars;
StateHasChanged();
}
将 SIgnalR 用于 Web 程序集应用程序,让我觉得有点倒退。 SignalR 是一个 javascript 库,应用程序必须通过 JSinterop 写入数据。
这正是服务器端 blazor 应用程序所需要的,但对于 Web 程序集,编写 C# class 并使用 HttpClient class 或 ClientWebSocket [=14= 会更容易]],它会做同样的事情,但在网络程序集内。