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

艾伦·亚历克斯

我是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());执行时,UpdateTimein中函数TimeHub未得到执行,并且客户端未得到任何消息。

课堂上尝试使用"UpdateTime""SendMessage""ReceiveMessage"作为方法没事。有人可以指出我的错误。Clients.All.SendAsyncTimeRelay

艾伦·亚历克斯

我知道它可以正常工作了,我想我会在这里回答。感谢@TaoZhou的提示。

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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Asp.net .core web api 版本控制不适用于 Url 路径段

Postman JSON 不适用于 ASP.NET Core Web API

ASP.NET Core Web API 不适用于 Azure

.Net Core Web API基本身份验证授权不适用于Azure

我在 ASP.NET Core 2.2 Web API 中设置了 JWT 中间件。它仅适用于 RSA256 而不适用于 HS256

ASP.NET Core API 的 GET 请求中的可选参数不适用于 Swagger

.net Core API 不适用于 IIS

添加FriendlyUrls时,jQuery ajax调用不适用于ASP.Net Web窗体

ASP .Net Core Web 应用程序调用 Web API

如何从Web API调用ASP.NET Core Web MVC

对Web-api的ajax调用适用于GET,但不适用于POST

Asp.Net Core WEB API错误404调用方法

FromBody路由不适用于ASP.NET Core

路由不适用于 asp.net api 项目

403 Forbidden Error for .Net Core 3.1 Web Api 仅适用于 Delete & PUT 方法

未调用以.net框架为目标的ASP.NET CORE 2.2对Web api的调用

从IIS内的.NET Core 2.1 Web API项目启动SignalR

使用Web Api作为客户端的SignalR [.Net Core]

.Net Core Web API

使用Razor从ASP.Net Core 2 Web App调用Web API

Azure AD:从其他 .net Core Web API 调用 .net Core Web API

调试asp.net core web API

映射不适用于api调用

ASP.NET Core 3.1中的asp-action不适用于端点路由

Web配置Windows授权。适用于部署,但不适用于本地。ASP.net

dot net core中基于web api调用的派生配置

如何从Controller进行HTTP调用?使用Web API的Asp.Net Core C#

如何在新的ASP.NET Core中调用Web API非默认构造函数

如何从ASP.NET Core的客户端调用Web api方法?