Asp.Net WebApi2 Enable CORS not working with AspNet.WebApi.Cors 5.2.3

后端 未结 11 497
庸人自扰
庸人自扰 2020-11-27 11:06

I tried to follow the steps at http://enable-cors.org/server_aspnet.html to have my RESTful API (implemented with ASP.NET WebAPI2) work with cross origin requests (CORS Enab

相关标签:
11条回答
  • 2020-11-27 11:43

    No-one of safe solution work for me so to be safer than Neeraj and easier than Matthew just add: System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

    In your controller's method. That work for me.

    public IHttpActionResult Get()
    {
        System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        return Ok("value");
    }
    
    0 讨论(0)
  • 2020-11-27 11:44

    You just need to change some files. This works for me.

    Global.ascx

    public class WebApiApplication : System.Web.HttpApplication {
        protected void Application_Start()
        {
            WebApiConfig.Register(GlobalConfiguration.Configuration);
        } }
    

    WebApiConfig.cs

    All the requests has to call this code.

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config)
        {
            EnableCrossSiteRequests(config);
            AddRoutes(config);
        }
    
        private static void AddRoutes(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "api/{controller}/"
            );
        }
    
        private static void EnableCrossSiteRequests(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute(
                origins: "*", 
                headers: "*", 
                methods: "*");
            config.EnableCors(cors);
        } }
    

    Some Controller

    Nothing to change.

    Web.config

    You need to add handlers in your web.config

    <configuration> 
      <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>   
      </system.webServer> 
    </configuration>
    
    0 讨论(0)
  • 2020-11-27 11:44

    In case of CORS request all modern browsers respond with an OPTION verb, and then the actual request follows through. This is supposed to be used to prompt the user for confirmation in case of a CORS request. But in case of an API if you would want to skip this verification process add the following snippet to Global.asax

            protected void Application_BeginRequest(object sender, EventArgs e)
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                {
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
    
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                    HttpContext.Current.Response.End();
                }
            }
    

    Here we are just by passing the check by checking for OPTIONS verb.

    0 讨论(0)
  • 2020-11-27 11:57

    I've created a pared-down demo project for you.

    • Source: https://github.com/bigfont/webapi-cors
    • Api Link: https://cors-webapi.azurewebsites.net/api/values

    You can try the above API Link from your local Fiddler to see the headers. Here is an explanation.

    Global.ascx

    All this does is call the WebApiConfig. It's nothing but code organization.

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            WebApiConfig.Register(GlobalConfiguration.Configuration);
        }
    }
    

    WebApiConfig.cs

    The key method for your here is the EnableCrossSiteRequests method. This is all that you need to do. The EnableCorsAttribute is a globally scoped CORS attribute.

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            EnableCrossSiteRequests(config);
            AddRoutes(config);
        }
    
        private static void AddRoutes(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "api/{controller}/"
            );
        }
    
        private static void EnableCrossSiteRequests(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute(
                origins: "*", 
                headers: "*", 
                methods: "*");
            config.EnableCors(cors);
        }
    }
    

    Values Controller

    The Get method receives the EnableCors attribute that we applied globally. The Another method overrides the global EnableCors.

    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { 
                "This is a CORS response.", 
                "It works from any origin." 
            };
        }
    
        // GET api/values/another
        [HttpGet]
        [EnableCors(origins:"http://www.bigfont.ca", headers:"*", methods: "*")]
        public IEnumerable<string> Another()
        {
            return new string[] { 
                "This is a CORS response. ", 
                "It works only from two origins: ",
                "1. www.bigfont.ca ",
                "2. the same origin." 
            };
        }
    }
    

    Web.config

    You do not need to add anything special into web.config. In fact, this is what the demo's web.config looks like - it's empty.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    </configuration>
    

    Demo

    var url = "https://cors-webapi.azurewebsites.net/api/values"
    
    $.get(url, function(data) {
      console.log("We expect this to succeed.");
      console.log(data);
    });
    
    var url = "https://cors-webapi.azurewebsites.net/api/values/another"
    
    $.get(url, function(data) {
      console.log(data);
    }).fail(function(xhr, status, text) {
      console.log("We expect this to fail.");
      console.log(status);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    0 讨论(0)
  • 2020-11-27 11:59

    Hope this helps someone in the future. My problem was that I was following the same tutorial as the OP to enable global CORS. However, I also set an Action specific CORS rule in my AccountController.cs file:

    [EnableCors(origins: "", headers: "*", methods: "*")]
    

    and was getting errors about the origin cannot be null or empty string. BUT the error was happening in the Global.asax.cs file of all places. Solution is to change it to:

    [EnableCors(origins: "*", headers: "*", methods: "*")]
    

    notice the * in the origins? Missing that was what was causing the error in the Global.asax.cs file.

    Hope this helps someone.

    0 讨论(0)
提交回复
热议问题