gpt4 book ai didi

c# - 调用 SignalR Hub 不适用于 Asp.Net Core Web API

转载 作者:行者123 更新时间:2023-12-02 02:58:56 24 4
gpt4 key购买 nike

我是 SignalR 的新手。我正在尝试设置一个 Asp.Net Core WebAPI,以便其他客户端可以使用 SignalR 连接到它并获取实时数据。我的 Hub 类是:

public class TimeHub : Hub
{
public async Task UpdateTime(string message)
{
await Clients.All.SendAsync("ReceiveMessage", message);
}
}

我有一个中继类,如下:

public class TimeRelay : ITimeRelay
{
private readonly IHubContext<TimeHub> _timeHubContext;

public TimeRelay(IHubContext<TimeHub> context)
{

_timeHubContext = context;
Task.Factory.StartNew(async () =>
{
while (true)
{
await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
Thread.Sleep(2000);
}
});
}
}

启动类:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();

app.UseHttpsRedirection();

app.UseSignalR((x) =>
{
x.MapHub<TimeHub>("/timeHub");
});
app.UseMvc();
}

客户端是一个控制台应用程序,代码为:

class Program
{
static Action<string> OnReceivedAction = OnReceived;

static void Main(string[] args)
{
Connect();
Console.ReadLine();
}

private static async void Connect()
{
var hubConnectionBuilder = new HubConnectionBuilder();

var hubConnection = hubConnectionBuilder.WithUrl("http://localhost:60211/timeHub").Build();

await hubConnection.StartAsync();

var on = hubConnection.On("ReceiveMessage", OnReceivedAction);

Console.ReadLine();
on.Dispose();
await hubConnection.StopAsync();
}

static void OnReceived(string message)
{
System.Console.WriteLine($"{message}");
}
}

我尝试调试该应用程序。客户端已成功连接到TimeHub。当客户端连接时,Clients.All 中的连接数从 0 更改为 1。但是,当执行 await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString()); 时,TimeHub 中的 UpdateTime 函数 没有被执行,客户端也没有收到任何消息。

我尝试使用 "UpdateTime""SendMessage""ReceiveMessage" 作为 Clients.All.SendAsync 中的方法TimeRelay 类中。什么都没起作用。有人可以指出我的错误吗?

最佳答案

对于客户端,如果没有客户端连接到服务器,则该值为空。对于同时启动 Asp.Net Core SignalRConsole AppClients 可能为 null,因为 Index可以在控制台应用程序连接 signalR 服务器之前调用。

尝试以下步骤:

  1. 更改TimeHub

    public class TimeHub: Hub
    {
    public async Task UpdateTime(string message)
    {
    if (Clients != null)
    {
    await Clients.All.SendAsync("ReceiveMessage", message);
    }
    }
    }
  2. 注册TimeHub

     services.AddSingleton<TimeHub>();  
  3. Controller

     public class HomeController : Controller
    {
    private readonly TimeHub _timeHub;
    public HomeController(TimeHub timeHub)
    {
    _timeHub = timeHub;
    }
    public IActionResult Index()
    {
    Task.Factory.StartNew(async () =>
    {
    while (true)
    {
    try
    {
    await _timeHub.UpdateTime(DateTime.Now.ToShortDateString());
    Thread.Sleep(2000);
    }
    catch (Exception ex)
    {

    }
    }
    });
    return View();
    }

关于c# - 调用 SignalR Hub 不适用于 Asp.Net Core Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com