本文介绍了调用SignalR Hub不适用于Asp.Net Core Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm a newb to SignalR. I'm trying to set up a Asp.Net Core WebAPI so that other clients can connect to it using SignalR and get real-time data.My Hub class is:

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

我有一个中继课程,如下所示:

I have a relay class as follows:

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();
}

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

The client is a console application and the code is:

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函数未执行,并且客户端也未收到任何消息.

I tried debugging the application. The client got connected to the TimeHub succesfully. The no of connections in Clients.All changed from 0 to 1, when the client got connected. But, when await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString()); is executed, the UpdateTime function in TimeHub is not getting executed and the client is not getting any message.

我尝试在TimeRelay类的Clients.All.SendAsync中使用"UpdateTime""SendMessage""ReceiveMessage"作为方法.没事.有人可以指出我的错误.

I tried using "UpdateTime", "SendMessage", and "ReceiveMessage" as method in Clients.All.SendAsync in TimeRelay class. Nothing worked. Could someone point out my mistake in this.

推荐答案

我可以使用它,并认为我会在这里回答.感谢@TaoZhou的提示.

I got it to work and thought I will answer it here. Thanks @TaoZhou for the tip.

我的错误是从服务器发送"UpdateTime"并在客户端等待"ReceiveMessage".

My mistake was sending "UpdateTime" from server and waiting on "ReceiveMessage" at the client.

理想情况下,代码应如下所示:

Ideally the code should look like the following:

SignalR服务器:
await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());

SignalR Server:
await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());

SignalR客户端:
var on = hubConnection.On("UpdateTime", OnReceivedAction);

SignalR Client:
var on = hubConnection.On("UpdateTime", OnReceivedAction);

在这种情况下,从服务器发送的任何消息都将立即在客户端收到.
请参考问题中提供的代码以获取更多信息.

In this case any message send from the server would be received at the client instantly.
Please refer the code provided in the question for more info.

这篇关于调用SignalR Hub不适用于Asp.Net Core Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 01:01