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

时间:2017-06-05 22:19:37

标签: asp.net-mvc asp.net-web-api cors

我正在努力让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函数时,我的过滤器属性似乎没有触发。为什么会这样?

帮助表示赞赏。

2 个答案:

答案 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());