【问题标题】:Blazor wasm client-server communicationBlazor wasm 客户端-服务器通信
【发布时间】:2021-11-10 11:47:38
【问题描述】:

我正在使用 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();
}

【问题讨论】:

  • JSON 支持对象和数组。请显示您的代码和示例数据,并具体说明正在发生的错误/问题。我们无法修复代码描述。请提供问题的minimal reproducible example。另见How to Ask。谢谢。
  • 感谢您的代码,但也请按要求对您的具体问题提供清晰的解释。

标签: c# blazor webassembly


【解决方案1】:

将 SIgnalR 用于 Web 组装应用程序,让我觉得有点倒退。 SignalR 是一个 javascript 库,应用程序必须通过 JSinterop 写入数据。

这正是服务器端 Blazor 应用程序所需要的,但对于 Web 程序集,编写 C# 类并使用 HttpClient 类或 ClientWebSocket 类会更容易,它们将在 Web 程序集内执行相同的操作。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多