How to enable cross origin requests in ASP.NET MVC 4 on POST using Angular 2

angular, asp.net-mvc, asp.net-mvc-4, cors, javascript

Solution

I found how to make it work. First I apply what proposed me sideshowbarker

if (Request.Headers.AllKeys.Contains("Origin", StringComparer.OridinalIgnoreCase) &&
    Request.HttpMethod == "OPTIONS") {
    Response.Flush();
}

and I was missing something in my Headers, I was doing "*" all the way but finally with these parameters it worked

filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

for those who are interested in the final form of my class here it is

using System;
using System.Web;
using System.Web.Mvc;

namespace Via.Client.WebMvc
{
    public class AllowCrossSiteAttribute : System.Web.Mvc.ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {    
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Credentials", "true");

            if (filterContext.HttpContext.Request.HttpMethod == "OPTIONS")
            {
                filterContext.HttpContext.Response.Flush();
            }

            base.OnActionExecuting(filterContext);
        }
    }
}

Problem

I'm trying to make a POST request with CORS. I've a class that adds the correct response header on my methods inside my controller ``` using System; using System.Web.Mvc; public class AllowCrossSiteAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200"); filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*"); filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Credentials", "true"); base.OnActionExecuting(filterContext); } } ``` and I use it like this ``` [AllowCrossSite] public ActionResult GetReportParameters(string IdRapport) ``` and I get the expected result But the problem is when I'm trying to make a POST request with a custom header to pass this specific content type ``` 'Content-Type': 'application/json; charset=utf-8' ``` I'm actually getting these Response headers So it's like nothing is done about the header even if I'm correctly going in my attribute class. Here is my front side in Angular 2 service ``` const headers = new Headers({ 'Content-Type': 'application/json; charset=utf-8' }); const options = new RequestOptions({ headers: headers , withCredentials: true }); const mock = { name: 'TitreRegroupement1', visible: false, type: 'System.String', value: 'Test' }; // tslint:disable-next-line:max-line-length const body = JSON.stringify({ idRapport: '00392024-d171-4f39-9c5c-97a51f53fd54', filtre: '', exportFormat: '', parameters: data }); return this.http.post('http://localhost:8080/ReportingViewer/ExportReport', body, options) .map((response: Response) => { return this.extractSingleData(response, Parameters); }) .catch(this.handleError); } ``` By using postman there is no problem to declare, the whole thing travel correctly I can access my parameters from the method inside the controller with no problem.

Original source

Related problems