为什么 SignalR 无法在此处绑定参数?

问题描述 投票:0回答:1

我正在开发一个 WPF 应用程序(客户端),它使用 .NET SignalR 驱动程序调用 SignalR 方法,如下所示:

private void TEST_button_Click(object sender, RoutedEventArgs e) {
    Global.SignalR?.InvokeAsync("Ping").Wait();
    Global.SignalR?.InvokeAsync("Ding", 123).Wait();
}

SignalR Hub 在 ASP.NET Core 应用程序上运行,如下所示:

public class ChatHub(ILogger<ChatHub> logger) : Hub {
    public async Task Ping() {
        logger.LogInformation("Ping!");
        await Clients.Caller.SendAsync("Pong");
    }

    public async Task Ding(int x) {
        logger.LogInformation($"Ding! {x}");
        await Clients.Caller.SendAsync("Dong");
    }
}

按下测试按钮时,“Ping!”消息显示在服务器调试输出中,并且在“Pong!”之后不久显示。消息显示在客户端调试输出中。

然后,客户端在尝试使用以下消息调用“Ding”时抛出异常:

由于服务器错误,无法调用“Ding”。 InvalidDataException:绑定参数时出错。确保提供的值的类型与正在调用的集线器方法的类型匹配。)

相反,我希望服务器输出“叮!123”而不会崩溃。

c# signalr signalr-hub asp.net-core-signalr signalr.client
1个回答
0
投票

通过添加启用更多调试后:

"Microsoft.AspNetCore.SignalR": "Debug",
"Microsoft.AspNetCore.Http.Connections": "Debug"

在 appsettings.json 中我发现了以下消息:

System.InvalidOperationException:此应用程序已禁用基于反射的序列化。使用源生成器 API 或显式配置“JsonSerializerOptions.TypeInfoResolver”属性。

事实证明与以下内容相关:https://learn.microsoft.com/en-us/dotnet/core/compatibility/serialization/8.0/publishtrimmed

因此,在项目配置中将 PublishTrimmed 设置为 false 后,它现在可以按预期工作。我很可能稍后会继续使用源生成器 api,但至少我现在知道问题的根源是什么。

© www.soinside.com 2019 - 2024. All rights reserved.