0

该应用程序一直在 .net core 2.1 中完美运行。signalR 服务器的配置类似于public void ConfigureServices(IServiceCollection services)方法中的以下代码片段:

```

services.AddCors(setupAction =>
  setupAction.AddPolicy("MyPolicy",
                    builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials()))

```

在配置方法中,我有以下代码片段:

```

 app.UseCors("MyPolicy")

```

Angular 客户端应用程序的代码像以下代码片段一样启动连接:

```

this._connection = this._connection || new HubConnectionBuilder()
        .withUrl('https://localhost:44314/xyz/test?abc=123', options)
        .build();

```

正如我所说,此设置一直运行良好。我将 .net 核心应用程序(signalR 服务器)从 2.1 升级到 2.2(dotnetcore SDK 版本 2.2.101),并将 signalR 客户端包升级到 1.1.0。signalR 服务器为 Angular 应用程序和另一个 C# 应用程序提供服务。C# 应用程序完美地连接到 signalR 服务器,它会做它应该做的任何事情,但是 angular 应用程序会产生以下错误消息:

从源“ https://localhost:44303 ”访问“ https://localhost:44314/xyz/test/negotiate?abc=123 ”的 XMLHttpRequest已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:当请求的凭据模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。

在 Angular 应用程序和 C# 客户端应用程序中,signalR 客户端的版本都是 1.1.0。

升级到 .net core 2.2 的任何原因导致此通信失败以及可能的解决方案是什么?!

4

2 回答 2

1

如您所见,浏览器清楚地说明了问题所在。您不能使用allowAnyOriginAccess-Control-Allow-Origin: *以 响应allowCredentials)。要么缩小来源访问范围,要么取消凭证配额。

我不确定凭据部分是由于接受凭据标头的规则还是由于请求中实际存在凭据而引起的。你必须检查一下。

升级到 .net core 2.2 的任何原因导致此通信失败

也许实现确实以这种方式发生了变化,内部提到的选项是互斥的,而现在完全控制权交还给了程序员——但这只是一个幸运的猜测。

于 2018-12-31T15:35:38.817 回答
1

这个问题有两种解决方案,可以选择其中之一:

解决方案 1:明确指定 CORS 来源。解决方案 2:或者编写一个中间件来生成预期的标头。

在这里找到更多信息:

https://github.com/aspnet/AspNetCore/issues/4457

于 2018-12-31T17:48:48.870 回答