通过 Web.config 启用 CORS 不适用于 .net WebApi

Posted

技术标签:

【中文标题】通过 Web.config 启用 CORS 不适用于 .net WebApi【英文标题】:Enable CORS via Web.config not working for .net WebApi 【发布时间】:2017-11-06 19:05:35 【问题描述】:

我正在尝试让 CORS 为我的 MVC Post 操作工作。

我有一个 MVC 属性:

using System;
using System.Configuration;
using System.Web.Mvc;
using System.Web.WebPages.Razor.Configuration;

namespace MyApp

    public class AllowCorsJsonAttribute : ActionFilterAttribute
    
        private static String _allowHosts = null;
        public static String AllowHosts
        
            get
            
                if(_allowHosts == null)
                
                    _allowHosts = ConfigurationManager.AppSettings["CorsAllowHost"] ?? "";
                
                return _allowHosts;
            
        

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        
#if DEBUG
            if (filterContext.RequestContext.HttpContext.Request.IsLocal)
            
                filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", AllowHosts);
                filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
                filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "*");
                filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Credentials", "true");
            
#endif
            base.OnActionExecuting(filterContext);
        
    

要为我的 web api 控制器启用 CORS,我这样做:

public static class WebApiConfig

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    
#if DEBUG
        var cors = new EnableCorsAttribute(
            origins: AllowCorsJsonAttribute.AllowHosts,
            headers: "*",
            methods: "*")
        
            SupportsCredentials = true
        ;
        config.EnableCors(cors);
#endif
    

    public static void Register(HttpConfiguration config)
    
        EnableCrossSiteRequests(config);
        ....
    

我可以对我的 webAPI2 控制器执行 GET/PUT/etc 操作。我能够对具有 [AllowCorsJson] 属性的 MVC 控制器操作执行 Get 请求。但是,由于预检选项检查一直失败,我无法发布到 MVC 操作。选项响应中没有任何 CORS 标头。就像我的属性甚至不适用于 POST 方法。

当我将属性应用到它时,此获取请求有效。

    [AllowCorsJson]
    public ActionResult GetExecuteModel(Int32 id)
    
        var editorModel = GetExecutionModel(id);
        editorModel.UserList = null;
        return Json(editorModel, JsonRequestBehavior.AllowGet);
    

但是 POST 到此 URL 失败:

    [HttpPost]
    [AllowCorsJson]
    public ActionResult ExecuteSave(MyModel myModel)
    
        if (!ModelState.IsValid)
        
            Response.StatusCode = (Int32)HttpStatusCode.BadRequest;
            return Json(ModelState);
        

        UpdateMyModel(myModel);

        return Json(null);
    

由于某种原因,我的过滤器属性在 POST 到 ExecuteSave 函数时似乎没有触发。为什么会这样?

帮助表示赞赏。

【问题讨论】:

您使用的是 Web API 2 吗?你不需要自己动手,MS 有一个库可以做到这一点,你可以将它设置为只接受 localhost - docs.microsoft.com/en-us/aspnet/web-api/overview/security/… 若要设置为仅允许本地主机,请将来源设置为config.EnableCors(new EnableCorsAttribute("http://localhost:3000", "*", "*")); 此外,Web API 过滤器位于 System.Web.Http.Filters 命名空间中,而不是 System.Web.Mvc 中 我正在使用 WebAPI 2。我正在使用他们的属性为我的 web api 东西启用 COR。它工作正常。我需要将 MVC 控制器的操作暴露给 CORS。 (原因是我想重用 FORM POST 中的一些代码)这就是我的问题所在。但我放弃了做这项工作。 MVC 控制器似乎没有正确响应预检 OPTIONS 请求。 这里真正的答案是简单地为调用创建一个 WebAPI 控制器,而不是滥用 MVC 控制器。 (我刚刚进行了重构,以便我的 MVC 和 WebAPI 控制器使用相同的代码进行处理/验证。) 我知道如何让 CORS 在 webAPI 上工作。问题是让它在 MVC 控制器的 POST 操作上工作。 是找到您的帖子操作还是响应返回但没有 CORS 标头? 【参考方案1】:

您可以使用 WebApiConfig.cs 中的以下代码行在 webapi2 应用程序中启用 CORS:

 config.EnableCors(allowedApp);

您还需要安装以下 NUGET 包来实现此目的:

 Install-Package Microsoft.AspNet.WebApi.Cors

【讨论】:

【参考方案2】:

尝试以下方法之一

config.EnableCors(new EnableCorsAttribute("http://localhost:1219", headers: "*", methods: "*")); config.Filters.Add(new AuthorizeAttribute());

【讨论】:

以上是关于通过 Web.config 启用 CORS 不适用于 .net WebApi的主要内容,如果未能解决你的问题,请参考以下文章

如何启用 CORS

MVC Web API - CORS 策略不起作用

在 Azure 上为 .NET Web Api 启用 CORS

Spring Boot CORS 通过配置启用

Spring Boot CORS 通过配置启用

为 Web API 1、.net 4.0 启用 CORS 中的问题