Blazor SignalR传输自定义类对象为空问题及解决咨询
Blazor SignalR 自定义对象传输为空的解决方法
问题场景
在Blazor中使用SignalR时,传输单个字符串完全正常,但发送自定义Message类对象到服务器时,服务器接收到的是空对象。
问题根源
当前的Message类使用的是公共字段,而SignalR默认的序列化器(System.Text.Json)只会序列化带get/set的公共属性,字段不会被自动序列化,导致服务器无法解析到对象数据。
解决步骤
1. 将自定义类的字段改为公共属性(推荐方案)
这是最规范且无需额外配置的解决方式,同步修改服务端和客户端的Message类:
服务端修改后的代码
public class Message { // 替换字段为带get/set的公共属性 public string? User { get; set; } public string? Mesg { get; set; } public override string ToString() { return $"User = {User}; message = {Mesg} "; } } public class ChatHub : Hub { public async Task SendMessage(Message _message) { await Console.Out.WriteLineAsync(_message.ToString()); await Clients.All.SendAsync("ReceiveMessage", _message); } }
客户端修改后的代码
// 客户端的Message类同步改为属性 public class Message { public string? User { get; set; } public string? Mesg { get; set; } } private async Task Send() { if (hubConnection is not null) { await hubConnection.SendAsync("SendMessage", new Message() { User = userInput, Mesg = messageInput }); } } protected override async Task OnInitializedAsync() { hubConnection = new HubConnectionBuilder() .WithUrl(Navigation.ToAbsoluteUri("/chathub")) .Build(); hubConnection.On<Message>("ReceiveMessage", (_message) => { var encodedMsg = $"{_message.User}: {_message.Mesg}"; messages.Add(encodedMsg); InvokeAsync(StateHasChanged); }); await hubConnection.StartAsync(); }
2. 可选:配置序列化器支持字段(临时兼容方案)
如果不想修改类结构,可以通过配置让SignalR的序列化器包含字段。在服务端的Program.cs中添加:
builder.Services.AddSignalR() .AddJsonProtocol(options => { // 开启字段序列化支持 options.PayloadSerializerOptions.IncludeFields = true; });
注意:这种方式不符合C#封装规范,仅作为临时兼容方案使用。
额外注意事项
- 确保客户端和服务端的
Message类结构完全一致:成员名称、类型、可访问性必须匹配,否则会出现序列化/反序列化失败。 - 如果使用了其他序列化器(比如Newtonsoft.Json),需要对应配置其序列化规则。
内容的提问来源于stack exchange,提问作者Андрей Галуза
相关产品推荐
相关产品推荐

