考虑服务器端的此类代码——它很脏,但工作正常:
public interface IBroadcastHub
{
Task CurrentTimeAsync(DateTimeOffset time);
}
public sealed class StrongBroadcastHub : Hub<IBroadcastHub>
{
}
public sealed class StrongHubWrapper : IBroadcastHub
{
private readonly IHubContext<StrongBroadcastHub, IBroadcastHub> _context;
public StrongHubWrapper(IHubContext<StrongBroadcastHub, IBroadcastHub> context)
{
this._context = context;
}
public Task CurrentTimeAsync(DateTimeOffset time)
{
Console.WriteLine($"Sending time to");
return _context.Clients.All.CurrentTimeAsync(time);
}
}
我可以创建包装器的实例并调用
CurrentTimeAsync
,一切都很好。
问题——只是我个人的偏好——是我想在 C# 代码中调用
CurrentTimeAsync
,但将其公开为“Hello”或其他什么。
我已经阅读了Microsoft文档,但我无法实现这一点——每当我使用强类型集线器时,方法
SendAsync
被隐藏,当我使用通用集线器时,它无论如何都不起作用(客户端似乎没有收到任何事物)。就像这里:
public sealed class GenericBroadcastHub : Hub
{
}
public sealed class DynamicHubWrapper : IBroadcastHub
{
private readonly IHubContext<GenericBroadcastHub> _context;
public DynamicHubWrapper(IHubContext<GenericBroadcastHub> context)
{
this._context = context;
}
public Task CurrentTimeAsync(DateTimeOffset time)
{
Console.WriteLine($"Sending time to");
return _context.Clients.All.SendAsync(Methods.ReceiveMessage, time);
}
}
那么我怎样才能达到这个效果——在C#代码中拥有方法A,并以B的名称公开它呢?这样的东西适用于 ASP.Net 控制器,控制器方法没有问题。
天哪,我的代码中有错误。好吧,我会放下我的骄傲:-)并将其用于教育目的。当您来回切换集线器时,一定不要忘记切换路由。
我一直保留在服务器中:
app.MapHub<StrongBroadcastHub>(Routes.SignalR);
“当然”,这应该与所使用的集线器同步更改,因此保留我的示例:
app.MapHub<GenericBroadcastHub>(Routes.SignalR);
我只希望这是“正确的方式”(我的意思是,总体上偏离强类型集线器,使用动态名称)。正如我所写,MS 解释了 HubMethodName 属性,但我不知道如何做到这一点。