我将SignalR-Service迁移到新的AspNetCore.SignalR(2.1预览版),现在我遇到CORS问题。我永远不会从同一个来源访问该服务,所以我需要一般禁用CORS。
我有以下的CORS政策
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
(来自不同来源的我的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");
});
}
}
}
示例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 Application 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()
答案 0 :(得分:4)
尝试在app.UseSignalR()
之上移动app.UseMvc()
app.UseCors("AllowCors");
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
app.UseMvc();
答案 1 :(得分:3)
我有同样的问题,我在客户端使用reactjs。
将版本从使用"@aspnet/signalr-client"
更改为"@aspnet/signalr"
解决了我的问题
答案 2 :(得分:1)
升级到preview1时,您必须将程序包升级到@aspnet/signalr
:
注意:以前用于JavaScript的SignalR客户端库的预览 被命名为@ aspnet / signalr-client。这已被弃用 预览1。
答案 3 :(得分:1)
如果要将项目迁移到asp.net核心版本3.x,则可以从Configure
方法升级routing,如下所示:
app.UseCors("AllowCors");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapHub<TestHub>("/test");
});
app.UseMvc
和app.UseSignalR
将替换为app.UseEndpoints
。 app.UseSignalR
也无法使用,因为:
此方法已过时,将在以后的版本中删除。
答案 4 :(得分:0)
我解决了这个问题。
客户端包和服务器包未处于完全的颠覆状态。 这是2.1-preview3210和2.1-preview3209(示例数字)。
服务器包经常发布到nuget feed,但客户端包(npm)没有。所以我自己克隆了最新的git repo并构建了libs并且它有效。
您将不再遇到问题,客户端软件包现在是最新的。
答案 5 :(得分:0)
这对我不起作用,并且版本稍有不同-
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();
}