【问题标题】:Error 204 when trying to connect to SignalR尝试连接到 SignalR 时出现错误 204
【发布时间】:2017-11-30 12:06:35
【问题描述】:

我无法连接到在 Windows 7 下运行的 ASP.NET Core 2.0.3 应用程序中的 SignalR Hub。 我使用来自 NuGet 的 SignalR 1.0.0-alpha1-final 作为服务器,使用 signalr-client-1.0.0-alpha2-final.min.js 作为 JavaScript 客户端。

这是我的中心:

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace MyProject
{
    public class MyHub: Hub
    {
        public override async Task OnConnectedAsync()
        {
            await Clients.All.InvokeAsync("Send", $"{Context.ConnectionId} joined");
        }

        public Task Send(string message)
        {
            return Clients.All.InvokeAsync("Send", $"{Context.ConnectionId}: {message}");
        }    
    }
}

在startup.cs中配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseHangfireDashboard();
    app.UseHangfireServer();

    app.UseSignalR(routes =>
    {
        routes.MapHub<MyHub>("hubs");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
}        

在测试页面中:

let transportType = signalR.TransportType[getParameterByName('transport')] || signalR.TransportType.WebSockets;
let http = new signalR.HttpConnection(`http://${document.location.host}/hubs`, { transport: transportType });
var connection = new signalR.HubConnection(http);

但是当此代码执行时,我从服务器收到错误 204。

更新

根据@Gabriel Luci 的回答,这里是工作代码:

let transportType = signalR.TransportType.LongPolling;
let http = new signalR.HttpConnection(`http://${document.location.host}/hubs`, { transport: transportType });
let connection = new signalR.HubConnection(http);

connection.start();

connection.on('Send', (message) => {
    console.log(message);
});

...
connection.invoke('Echo', "Hello ");

【问题讨论】:

  • 状态码 204 不是错误。
  • 在浏览器控制台中我读到:“WebSocket 连接到 'ws://localhost:51278/hubs?id=c9d62f69-8dac-408b-ac7a-10521eefd30f' 失败:WebSocket 握手期间出错:意外响应代码:204" 错误:无法启动连接。未定义

标签: javascript c# asp.net signalr asp.net-core-signalr


【解决方案1】:

GitHub 中提出了一个问题:https://github.com/aspnet/SignalR/issues/1028

显然 WebSockets 在 IIS 和 IIS Express 中不起作用。您需要使用长轮询。该问题中有一个示例代码的sn-p:

let connection = new HubConnection("someurl", { transport: signalR.TransportType.LongPolling });
connection.start().then(() => {});

【讨论】:

  • 确实我必须使用 LongPolling(啊……),但代码不起作用。我还必须添加一个 HttpConnection。我应该创建一个新答案来显示工作代码还是在此处发表评论?
  • 您可以编辑您的问题并将您的代码添加到底部。由你决定。
  • 这绝对令人难以置信。我在 VS2017 中运行,果然,如果不更改传输类型就无法让它工作。为什么 IIS Express 即使在 VS2017 中也不支持 WebSockets?认真的吗,微软?
  • 哦。因此,对于遇到此问题的任何人,websocket 支持需要 IIS Express 8.0+ Windows 8+ 或 Windows Server 2012+。因此,如果您在 Windows 7 机器上进行本地开发(就像我一样),则无法测试 websocket,因为实际上没有操作系统级别的支持,无论您运行的是什么版本的 IIS Express。
【解决方案2】:

在我的情况下,我必须删除允许任何来源并将其替换为 WithOrigins 和 AllowCredentials

 options.AddPolicy("policy",
            builder =>
            {
                builder.WithOrigins("http://localhost:8081");
                builder.AllowAnyMethod();
                builder.AllowAnyHeader();
                builder.AllowCredentials();

            });

【讨论】:

  • 我错过了builder.AllowCredentials();
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2014-10-05
  • 2016-09-25
  • 2020-04-26
  • 2015-05-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多