框架从 4.5.2 升级到 4.7.2 后 C# Web API 引发 CORS 错误

Posted

技术标签:

【中文标题】框架从 4.5.2 升级到 4.7.2 后 C# Web API 引发 CORS 错误【英文标题】:C# Web API Throws CORS error after framework upgrade from 4.5.2 to 4.7.2 【发布时间】:2021-05-05 08:08:21 【问题描述】:

我有一个用 C# 编写的 ASP.NET MVC 和 REST Web API。几天前,我们将 ASP.NET MVC 和 Web API 的框架版本从 4.5 升级到了 4.7.2,之后,它不断抛出 CORS 错误,说我的 ASP.NET MVC URL 无法调用 REST

请求的资源上不存在“Access-Control-Allow-Origin”标头

有趣的是,当我们几年前开始这个项目时,我们已经配置了 Answers 中提到的修复程序,并且到目前为止工作正常。

我什至尝试了该问题的其他答案,但仍然抛出相同的错误。我什至升级了所有 NuGet 包,但遇到了同样的问题。

我正在通过 Ajax 从我的 ASP.NET MVC 应用程序调用 API。

这是我的 Global.asax.cs 文件配置

protected void Application_BeginRequest()
    
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS,");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "userId,ApiKey");
            HttpContext.Current.Response.End();
        
    

我缺少任何配置?

【问题讨论】:

您是否已恢复到旧版本以确认这实际上导致了问题?在任何情况下,我们都需要您的配置来验证这一点。 @Marco 是的,我有,它工作正常。事实上,它也适用于升级的 MVC 版本和旧的 API 构建。 然后我们将需要您的 api 配置来为我们自己验证这一点。不看代码,都是猜测。 粗略猜测 - 是否需要设置 CompatibilityVersion? SetCompatibilityVersion @user1672994 我没有使用 .netcore 【参考方案1】:

这是框架升级后它停止为您工作的原因。

在 4.5.2 上,将为 OPTIONS 触发 Application_BeginRequest。 在 4.7.2 上,不会为 OPTIONS 触发 Application_BeginRequest。

如果您在 web.config 中添加以下内容,则 Application_BeginRequest 将在 4.7.2 上为 OPTIONS 触发。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

源码:https://github.com/ShahJe/MVCOptionsDemo

【讨论】:

它仍然抛出同样的错误。你能提一下只是想检查的参考吗 看看答案中提到的repo。我在 Application_BeginRequest 上设置了一个断点,并注意到升级到 4.7.2 后它没有达到断点。我搜索了 Application_BeginRequest not fire for OPTIONS,看到有人推荐使用 runAllManagedModulesForAllRequests。我在 web.config 中添加了它,并且断点在 4.7.2 开始为我命中。

以上是关于框架从 4.5.2 升级到 4.7.2 后 C# Web API 引发 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

type没有GetProperties 看下框架版本

type没有GetProperties 看下框架版本

从 .NET 4.5 MVC 4 升级到 .NET 4.5.2 MVC 5.2

具有 4.7.2 目标框架版本的 C# 项目可以在 .net 4.6.1 上运行吗

使用 Devart.MySql 将 EF6 升级到 EF Core 3

C# WPF实战项目升级了