Nancy + .NET Core 使 CORS 无法正常工作

Posted

技术标签:

【中文标题】Nancy + .NET Core 使 CORS 无法正常工作【英文标题】:Nancy + .NET Core enable CORS not working 【发布时间】:2017-05-21 22:39:00 【问题描述】:

我在客户端有以下请求:

$.get(getUrl)

我在后端尝试了以下方法:

Is it possible to enable CORS using NancyFX?

我也尝试过这四种方法(分别,因此被注释掉了):

        // protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    // 
    //     pipelines.AfterRequest += ctx =>
    //     
    //         ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    //         ctx.Response.Headers.Add("Access-Control-Allow-Headers", "*");
    //         ctx.Response.Headers.Add("Access-Control-Allow-Methods", "*");
    //     ;
    // 

    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    
        pipelines.AfterRequest += (ctx) =>
        
            ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        ;
    

    protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
    
        base.RequestStartup(container, pipelines, context);

        // pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) =>
        // 
        //     ctx.Response.WithHeader("Access-Control-Allow-Origin", "*")
        //         .WithHeader("Access-Control-Allow-Methods", "*")
        //         .WithHeader("Access-Control-Allow-Headers", "*");        
        // );

        // pipelines.AfterRequest += (ctx) =>
        // 
        //     ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        //     ctx.Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        // ;

我什至为我的模块尝试过类似的东西:

After += (Context) =>

    Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    Context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
    Context.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, x-requested-with, Authorization, Accept, Origin");
;

所有的结果都一样:

XMLHttpRequest cannot load http://localhost:5000/registration/signup. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5001' is therefore not allowed access. The response had HTTP status code 401.

401 是因为我没有传入预期的自定义标头。我只是想先解决 CORS 问题

【问题讨论】:

在这篇 ***.com/questions/26171749/… 的帖子中,解决方案是使用 Nancy 模块并在管道结束后加载它。 Getting CORS To Work With Nancy的可能重复 【参考方案1】:

很好。这是一条两头蛇。我曾尝试使用基本的 nodejs 反向代理,但当它不起作用时……这一切都说得通。

我对 Nancy 采取的一些方法似乎无法奏效,因为我有 auth 中间件代码,它在引导程序代码之前被命中/运行。因此,预检请求总是会立即获得 401(它们不会发送中间件正在检查的自定义标头),并且启用 CORS 的代码永远不会受到影响。

但是,另一个问题是本地主机。浏览器显然不允许本地主机的 CORS。所以这里的解决方案是使用ngrok(没有对此进行测试,但没有理由它不应该工作)。或运行 chrome,并将禁用的网络安全标志设置为 false(此方法因操作系统而异)。

我尝试了后一种选择,为了解决我的 Nancy CORS 代码未运行的问题,我将其全部删除并采用此处概述的标准 .NET Core CORS 方法:https://docs.microsoft.com/en-us/aspnet/core/security/cors

现在我的 Access-Control-Allow-Origin 标头正在设置中,并且 chrome 运行有些不安全。但它有效。

我认为在生产中我会使用像 nginx 这样的反向代理。而这一切都将成为遥远的记忆……

【讨论】:

以上是关于Nancy + .NET Core 使 CORS 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在 asp.net core 中启用 CORS

.net core api CORS 获得工作,但 cors 获得 405

基于 .Net Core 中的 appSettings 使用 Cors

启用 Cors .Net Core

在 ASP.Net 5 / Core 中启用跨域资源共享 (CORS)

.NET Core 端点 + 全局 CORS