【问题标题】:signalr with .net core 2.0带有 .net core 2.0 的信号器
【发布时间】:2018-07-19 11:10:14
【问题描述】:

我正在尝试将 SignalR 与核心 2.0 一起使用。如果我将传输设置为 LongPolling 它可以工作,但我会收到有关超时的警告。我正在尝试将它与 WebSockets 一起使用,但我得到了

WebSocket 未处于 OPEN 状态

我检查了很多类似的问题,其中大多数是由于系统限制,但我使用的是 Windows 10 和 Chrome v.67。 我认为问题出在 Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("CorsPolicy");
    app.UseSignalR(routes =>
    {
        routes.MapHub<NotifyHub>("/notify");
    });
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
    {
        builder.AllowAnyMethod()
               .AllowAnyHeader()
               .WithOrigins("http://localhost:52170/");
    }));
    services.AddSignalR();
}

前端(TypeScript):

ngOnInit() {
        let builder = new HubConnectionBuilder();
        this.hubConnection = builder.withUrl("http://localhost:52170/notify", HttpTransportType.WebSockets).build();//'http://localhost:1874/notify').build();
        this.hubConnection.serverTimeoutInMilliseconds = 5000;
        this.hubConnection
            .start()
            .then(() => console.log('Connection started!'))
            .catch(err => console.log(err)); //'Error while establishing connection :('));
        console.log(this.hubConnection);
        this.hubConnection.onclose = e => {
            this.hubConnection.start();
        }
   }

我从浏览器收到这两条消息:

信息:WebSocket 连接到 ws://localhost:52170/notify?id=SJ4cb49oWZtL6lIt4cqhKg WebSocket 不是 处于打开状态

【问题讨论】:

    标签: c# asp.net-mvc sockets asp.net-core signalr


    【解决方案1】:

    @Jamil,我在项目中创建的代码最好,它正在工作。您能否提供更多详细信息或与以下代码进行比较。如果有什么不同,也请告诉我。

    -- 在 Startup.cs 中

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    
        //DKS: Makes the SignalR services available to the dependency injection system. 
        services.AddCors(options => options.AddPolicy("CorsPolicy",
        builder =>
        {
            builder.AllowAnyMethod().AllowAnyHeader()
                   .WithOrigins("http://localhost:53249")
                   .AllowCredentials();
        }));
    
        services.AddSignalR();
    }
    

    // 这个方法被运行时调用。使用此方法配置 HTTP 请求管道。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
    
        app.UseStaticFiles();
    
        app.UseCors("CorsPolicy");
        app.UseSignalR(routes =>
        {
            routes.MapHub<ChatHub>("/chatHub");
        });
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    }
    }
    

    --- home.component

    import { Component, OnInit } from '@angular/core';
    import { HubConnection } from '@aspnet/signalr';
    import * as signalR from '@aspnet/signalr';
    
    @Component({
        selector: 'app-home-component',
        templateUrl: './home.component.html'
    })
    
    export class HomeComponent implements OnInit {
        private _hubConnection: HubConnection | undefined;
        public async: any;
        message = '';
        messages: string[] = [];
    
        constructor() {
        }
    
        public sendMessage(): void {
            const data = `Sent by you: ${this.message}`;
    
            if (this._hubConnection) {
                this._hubConnection.invoke('SendAngular', data);
            }
    
            this.messages.push(data);
        }
        ngOnInit() {
            let builder = new signalR.HubConnectionBuilder();
            this._hubConnection = builder.withUrl("http://localhost:53249/chatHub", signalR.HttpTransportType.WebSockets).build();//'http://localhost:1874/notify').build();
            this._hubConnection.serverTimeoutInMilliseconds = 9999999999999;
            this._hubConnection
                .start()
                .then(() => console.log('Connection started!'))
                .catch(err => console.log(err)); //'Error while establishing connection :('));
            console.log(this._hubConnection);
    
            this._hubConnection.on('Send', (data: any) => {
                const received = `Received by Friend: ${data}`;
                this.messages.push(received);
            });
    
            //this._hubConnection.onclose = e => {
            //    this._hubConnection.start();
            //}
    
        }
    }
    

    using Microsoft.AspNetCore.SignalR;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace SignalRExample.Hubs
    {
        public class ChatHub : Hub
        {
            public Task SendAngular(string data)
            {
                return Clients.All.SendAsync("Send", data);
            }
        }
    }
    

    【讨论】:

    • 这个看起来一样,只是我没有sendMessage功能。我应该提供哪些额外的细节?我会尝试在一个新项目中测试它,如果它不起作用,那么系统有问题
    • 最后我部署了它,它在服务器上运行良好。不知道为什么它不能在本地机器上工作。谢谢
    • 在你的本地,你可以从 cmd ping "localhost:52170" 来检查它是否打开
    【解决方案2】:

    评论这一行“this.hubConnection.serverTimeoutInMilliseconds = 5000;”并再次检查。

    serverTimeoutInMilliseconds 太小。

    【讨论】:

    • @Jamil,最好是我在项目中创建的代码并且它正在工作。您能否提供更多详细信息或与以下代码进行比较。如果有任何不同,请告诉我。
    • 尝试将我的 Angular 应用程序附加到 Signalr 时遇到同样的困难对我来说似乎太难了,如果您可以分享您刚刚在 github 中完成的 Angular 和 Signalr 工作项目的链接,我将不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多