AspNetCore.SignalR 2.1和CORS

slx*_*shi 18 cors signalr asp.net-core

我正在将SignalR-Service迁移到新的AspNetCore.SignalR(2.1预览版),现在我遇到了CORS的问题.我永远不会从同一个来源访问该服务,所以我需要一般禁用CORS.

我有以下的CORS政策

services.AddCors(
            options => options.AddPolicy("AllowCors",
                builder =>
                {
                    builder
                        .AllowAnyOrigin()
                        .AllowCredentials()
                        .AllowAnyHeader()
                        .AllowAnyMethod();
                })
        );
Run Code Online (Sandbox Code Playgroud)

(来自不同来源的我的WebApi-Controller呼叫在这些策略下工作正常)

使用SignalR for AspNetCore(AspNetCore.SignalR.Server)的旧预览包我没有任何问题,但现在,我的测试客户端得到了一些http-405,这似乎是CORS的一个问题.

SignalR可能有额外的CORS配置,还是我需要允许其他东西?

编辑:我创建了一个新的/干净的示例项目,没有任何特殊的中间件来检查如果错误发生在这里,它确实发生.

示例WebApplication | startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(
                options => options.AddPolicy("AllowCors",
                    builder =>
                    {
                        builder
                            .AllowAnyOrigin()
                            .AllowCredentials()
                            .AllowAnyHeader()
                            .AllowAnyMethod();
                    })
            );
            services.AddMvc();
            services.AddSignalR(options =>
            {
            });
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors("AllowCors");
            app.UseMvc();
            app.UseSignalR(routes =>
            {
                routes.MapHub<TestHub>("/test");
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例Winforms应用程序

        private HubConnection _hubConnection;
    private void button1_Click(object sender, EventArgs e)
    {
        var connection = new HubConnectionBuilder().WithUrl("http://localhost:63771/test")
            .WithConsoleLogger()
            .WithTransport(Microsoft.AspNetCore.Sockets.TransportType.WebSockets)
            .Build();
        connection.StartAsync();
    }
Run Code Online (Sandbox Code Playgroud)

示例Winforms应用程序ConsoleOutput

fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[8]
   01/10/2018 15:25:45: Failed to start connection. Error getting negotiation response from 'http://localhost:63771/test'.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).
   bei System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   bei Microsoft.AspNetCore.Sockets.Client.HttpConnection.<Negotiate>d__42.MoveNext()
Run Code Online (Sandbox Code Playgroud)

小智 10

尝试移动app.UseSignalR()之上app.UseMvc()这样

app.UseCors("AllowCors");
app.UseSignalR(routes =>
    {
        routes.MapHub<TestHub>("/test");
    });
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

  • 我花了一天的时间来解决这个问题。您能解释为什么需要这种方式吗?我猜是因为UseMvc方法可能已经依赖SignalR路由进行“注册” (3认同)
  • @ MichaelJ.Heier我讨厌看到未回答的问题,因此:UseMvc是以这种方式配置的,具有默认路由,因此它必须是集合中的最后一个路由,以便在映射请求时允许其他路由优先...如果异常是由MVC处理SignalR应该处理的东西引起的。 (3认同)
  • 这个答案现在已被弃用。推荐的方法是在端点中进行此映射:endpoints.MapHub&lt;TestHub&gt;("/test"); (2认同)

Ian*_*ger 6

这对我不起作用,而一个完全不同的版本则适用-

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  ...
  app.UseCors(builder => builder
    .AllowAnyHeader()
    .AllowAnyMethod()
    .SetIsOriginAllowed((host) => true)
    .AllowCredentials()
  );

  app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); });
  app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我有同样的问题,我在客户端使用reactjs。将版本从使用更改"@aspnet/signalr-client""@aspnet/signalr"解决了我的问题