通过 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的主要内容,如果未能解决你的问题,请参考以下文章