我正在努力让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 /等等。我能够向具有[AllowCorsJson]属性的MVC控制器操作获取请求。但是,由于预检OPTIONS检查失败,我无法POST到MVC操作。选项响应中没有任何CORS头。这就像我的属性甚至不适用于POST方法。
当我将属性应用于此时,此get请求有效。
[AllowCorsJson]
public ActionResult GetExecuteModel(Int32 id)
{
var editorModel = GetExecutionModel(id);
editorModel.UserList = null;
return Json(editorModel, JsonRequestBehavior.AllowGet);
}
但是,此网址的POST失败:
[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函数时,我的过滤器属性似乎没有触发。为什么会这样?
帮助表示赞赏。
答案 0 :(得分:0)
您可以使用 WebApiConfig.cs 中的以下代码行在您的webapi2应用程序中启用CORS:
config.EnableCors(allowedApp);
您还需要安装以下NUGET包来实现此目的:
Install-Package Microsoft.AspNet.WebApi.Cors
答案 1 :(得分:0)
尝试以下其中一项
config.EnableCors(new EnableCorsAttribute("http://localhost:1219", headers: "*", methods: "*"));
config.Filters.Add(new AuthorizeAttribute());