如何使用Angular 2

时间:2017-05-11 10:19:29

标签: asp.net-mvc angular asp.net-mvc-4 post cors

我正在尝试使用CORS发出POST请求。

我有一个类,在我的控制器里面的方法上添加了正确的响应头

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);
    }
}

我就像这样使用它

[AllowCrossSite]
public ActionResult GetReportParameters(string IdRapport)

我得到了预期的结果enter image description here

但问题是当我尝试使用自定义标头发送POST请求以传递此特定内容类型时

'Content-Type': 'application/json; charset=utf-8'

我实际上正在获取这些响应标头

enter image description here

所以即使我正确地进入属性类,也就像标题没有做任何事情一样。

这是我在Angular 2 服务中的前端

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);
}

通过使用postman声明没有问题,整个事情正确地运行我可以从控制器内部的方法访问我的参数没有问题。

3 个答案:

答案 0 :(得分:4)

我找到了如何让它发挥作用。首先,我申请建议我 sideshowbarker

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

我在标题中遗漏了一些东西,我正在做" *"一路走来,但终于有了这些参数,它起作用了

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

对于那些对我班级的最终形式感兴趣的人来说,

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);
        }
    }
}

答案 1 :(得分:3)

您的前端JavaScript代码触发您的浏览器执行CORS预检OPTIONS请求。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

您需要更改服务器端代码以处理该OPTIONS请求,例如添加:

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

或者查看https://stackoverflow.com/search?q=%5Basp.net-mvc%5D+%5Bcors%5D+options以获取许多其他相关答案。

答案 2 :(得分:1)

您尝试过的代码都很好。这应该是有效的,但在你的情况下这不起作用。

我有一个关于你的参考,你必须检查出来

Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method