【发布时间】: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 标头?
标签: asp.net-mvc asp.net-web-api cors