如何在 SignalR 中使用与 C# 代码中实际方法名称不同的方法名称?

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

考虑服务器端的此类代码——它很脏,但工作正常:

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 控制器,控制器方法没有问题。

c# signalr signalr-hub
1个回答
0
投票

天哪,我的代码中有错误。好吧,我会放下我的骄傲:-)并将其用于教育目的。当您来回切换集线器时,一定不要忘记切换路由。

我一直保留在服务器中:

app.MapHub<StrongBroadcastHub>(Routes.SignalR);

“当然”,这应该与所使用的集线器同步更改,因此保留我的示例:

app.MapHub<GenericBroadcastHub>(Routes.SignalR);

我只希望这是“正确的方式”(我的意思是,总体上偏离强类型集线器,使用动态名称)。正如我所写,MS 解释了 HubMethodName 属性,但我不知道如何做到这一点。

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