SignalR 集线器不响应对象参数
SignalR hub not answering to object parameter
我找不到任何资源,也就是说我做不到。
我已完成所有设置 hub/client 并在参数为十进制时进行了测试,但是一旦我使用通用 class,服务器将不会做出反应。
SignalRMessage:
public class SignalRMessage<T>
{
public SignalRMessage(T value, string text)
{
Value = value;
Text = text ?? string.Empty;
}
public T Value { get; set; }
public string Text { get; set; }
}
集线器(OnConnected 成功):
public class JobHeaderHub : Hub
{
public override Task OnConnectedAsync()
{
Debug.WriteLine(Clients.Caller);
return base.OnConnectedAsync();
}
public async Task JobHeaderUpdated(SignalRMessage<decimal> message)
{
await Clients.Others.SendAsync("ReceiveJobHeaderUpdated", message);
}
public async Task JobHeaderCreated(SignalRMessage<decimal> message)
{
await Clients.Others.SendAsync("ReceiveJobHeaderCreated", message);
}
}
客户:
public class JobHeaderSingalRClient
{
private HubConnection connection;
public JobHeaderSingalRClient()
{
// connection = new HubConnectionBuilder().WithUrl(@"").WithAutomaticReconnect().Build();
connection = new HubConnectionBuilder().WithUrl(@"http://localhost:5000/jobheader").WithAutomaticReconnect().Build();
connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderUpdated", message => JobHeaderUpdated?.Invoke(message));
connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderCreated", message => JobHeaderCreated?.Invoke(message));
}
public static async Task<JobHeaderSingalRClient> CreateConnectedClient()
{
var client = new JobHeaderSingalRClient();
await client.ConnectAsync();
return client;
}
public async Task<JobHeaderSingalRClient> ConnectAsync()
{
await connection.StartAsync();
return this;
}
public event Action<SignalRMessage<decimal>> JobHeaderUpdated;
public async Task SendJobHeaderUpdated(decimal id, string message = null)
{
await connection.SendAsync("JobHeaderUpdated", new SignalRMessage<decimal>(id, message));
}
public event Action<SignalRMessage<decimal>> JobHeaderCreated;
public async Task SendJobHeaderCreated(decimal id, string message = null)
{
await connection.SendAsync("JobHeaderCreated", new SignalRMessage<decimal>(id, message));
}
}
我不知道为什么当参数是 SignalRMessage<decimal>
时服务器上的方法没有被命中。有谁知道?谢谢
我在使用带参数的构造函数时也遇到过此类问题。添加默认无参数构造函数后,所有这些都消失了。
这很可能与 signalR 无关,而是与底层 JSON 序列化有关。
必须指定类型才能序列化对象。
我在使用 object
类型的对象作为参数时遇到了类似的问题。
要排除故障,请打开 signalR 中的 verbose error messages
并查看是否记录了任何错误。
services.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});
我找不到任何资源,也就是说我做不到。
我已完成所有设置 hub/client 并在参数为十进制时进行了测试,但是一旦我使用通用 class,服务器将不会做出反应。
SignalRMessage:
public class SignalRMessage<T>
{
public SignalRMessage(T value, string text)
{
Value = value;
Text = text ?? string.Empty;
}
public T Value { get; set; }
public string Text { get; set; }
}
集线器(OnConnected 成功):
public class JobHeaderHub : Hub
{
public override Task OnConnectedAsync()
{
Debug.WriteLine(Clients.Caller);
return base.OnConnectedAsync();
}
public async Task JobHeaderUpdated(SignalRMessage<decimal> message)
{
await Clients.Others.SendAsync("ReceiveJobHeaderUpdated", message);
}
public async Task JobHeaderCreated(SignalRMessage<decimal> message)
{
await Clients.Others.SendAsync("ReceiveJobHeaderCreated", message);
}
}
客户:
public class JobHeaderSingalRClient
{
private HubConnection connection;
public JobHeaderSingalRClient()
{
// connection = new HubConnectionBuilder().WithUrl(@"").WithAutomaticReconnect().Build();
connection = new HubConnectionBuilder().WithUrl(@"http://localhost:5000/jobheader").WithAutomaticReconnect().Build();
connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderUpdated", message => JobHeaderUpdated?.Invoke(message));
connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderCreated", message => JobHeaderCreated?.Invoke(message));
}
public static async Task<JobHeaderSingalRClient> CreateConnectedClient()
{
var client = new JobHeaderSingalRClient();
await client.ConnectAsync();
return client;
}
public async Task<JobHeaderSingalRClient> ConnectAsync()
{
await connection.StartAsync();
return this;
}
public event Action<SignalRMessage<decimal>> JobHeaderUpdated;
public async Task SendJobHeaderUpdated(decimal id, string message = null)
{
await connection.SendAsync("JobHeaderUpdated", new SignalRMessage<decimal>(id, message));
}
public event Action<SignalRMessage<decimal>> JobHeaderCreated;
public async Task SendJobHeaderCreated(decimal id, string message = null)
{
await connection.SendAsync("JobHeaderCreated", new SignalRMessage<decimal>(id, message));
}
}
我不知道为什么当参数是 SignalRMessage<decimal>
时服务器上的方法没有被命中。有谁知道?谢谢
我在使用带参数的构造函数时也遇到过此类问题。添加默认无参数构造函数后,所有这些都消失了。
这很可能与 signalR 无关,而是与底层 JSON 序列化有关。 必须指定类型才能序列化对象。
我在使用 object
类型的对象作为参数时遇到了类似的问题。
要排除故障,请打开 signalR 中的 verbose error messages
并查看是否记录了任何错误。
services.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});