我正在开发一个 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”而不会崩溃。
通过添加启用更多调试后:
"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,但至少我现在知道问题的根源是什么。