【发布时间】:2018-06-19 12:55:31
【问题描述】:
我正在将我们的 SignalR-Service 迁移到新的 AspNetCore.SignalR(2.1 预览版),现在我遇到了 CORS 问题。我永远不会从同一来源访问该服务,因此我通常需要禁用 CORS。
我有以下 CORS 政策
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
(我的来自不同来源的 WebApi-Controller 调用在这些策略下运行良好)
使用用于 AspNetCore (AspNetCore.SignalR.Server) 的 SignalR 的旧预览包,我没有遇到任何问题,但现在,我的测试客户端得到了一些 http-405,这似乎是 CORS 的问题。
可能有针对 SignalR 的额外 CORS 配置,还是我需要允许其他配置?
编辑: 我创建了一个新的/干净的示例项目,没有任何特殊的中间件来检查错误是否发生在这里并且确实发生了。
示例 Web 应用程序 |启动.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");
});
}
}
}
示例 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();
}
示例 Winforms 应用程序控制台输出
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()
【问题讨论】:
-
您是否在 Startup 的
Configure方法中将值“AllowCors”传递给app.UseCors("AllowCors");?这应该就是你所需要的。 -
你在
Configure(IApplicationBuilder app, IHostingEnvironment env)的Startup.cs中有这个吗:app.UseCors("AllowCors"); -
我应该更清楚;我评论中的代码行不是您需要的all。您需要它,以及
ConfigureServices方法中已有的代码。他们一起工作。 -
是的,我已经使用了我创建的策略。我的 WebApi-Controller 已经在接受来自 X-Origins 的调用,因此我可以确定策略本身可以正常工作(对于 REST-Controller)但不适用于 SignalR 连接。
-
@slxSlashi 你修过吗?
标签: c# asp.net-core cors asp.net-core-signalr