admin 发布时间:2021-09-17 分类:记事 阅读:4347次 添加评论
将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,同域名访问没有问题,但是前端一直报跨域问题。原设置项:
services.AddCors(op => { op.AddPolicy("cors", builder => { builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials(); }); });
出现该问题的原因是由于 CORS 策略设置不正确造成的,原始设置我是允许所有 Origin 来源,在正常跨域请求正常,在请求Websocket相关请求时候提示跨域错误。
但是由于 dotnetCore 2.2 的限制,无法使用 AllowAnyOrigin() + AllowCredentials() 的组合,只能显式指定 Origin 来源,或者通过下述方式来间接实现。
解决方案1,修改跨域配置:
services.AddCors(op => { op.AddPolicy("cors", builder => { builder.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials(); }); });
解决方案2,直接采用中间件进行设置请求头:
public class CorsMiddleware { private readonly RequestDelegate next; public CorsMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { if (context.Request.Headers.ContainsKey(CorsConstants.Origin)) { context.Response.Headers.Add("Access-Control-Allow-Origin", context.Request.Headers["Origin"]); context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH"); context.Response.Headers.Add("Access-Control-Allow-Headers", context.Request.Headers["Access-Control-Request-Headers"]); context.Response.Headers.Add("Access-Control-Allow-Credentials", "true"); if (context.Request.Method.Equals("OPTIONS")) { context.Response.StatusCode = StatusCodes.Status200OK; return; } } await next(context); } }
//在Configure方法中添加如下内容 app.UseMiddleware<CorsMiddleware>();
下一篇:PGSQL数据库层面的加密解密
发表评论:
◎欢迎您的参与讨论。