http.put使用Chrome但不是IE

时间:2016-12-07 22:37:35

标签: angular asp.net-web-api cors asp.net-web-api2

我正试图让角度2在测试学习者项目中使用web api,但是我已经用http.put发了一个问题,并想知道是否有人可以对它进行说明。

我可以将对象发布到web api,我可以从中获取数据。

我在使用Chrome时遇到了PUT问题。我说使用Chrome的原因是它在Chrome中不起作用但在IE中有效 - 通常不会这样说;)

我正在使用的角度2方法就是这个。如果我用POST替换PUT,我可以在我的web api控制器中点击断点,但是使用PUT是不行的。

    updateUser(user: UserModel) {

    let body = JSON.stringify(user);
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let url: string = 'http://localhost:57465/api/user';

    this.http.put(url, body, { headers: headers })
        .map((res: Response) => res.json())
        .subscribe((res2) => {
            console.log('subscribed');
        });
}

控制台Chrome错误消息我在使用put:

XMLHttpRequest cannot load http://localhost:57465/api/user. Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

EXCEPTION: Response with status: 0  for URL: null

web api方法直接开箱即用。我还没有和他们做任何事情。如果我在POST上设置一个断点,它将被击中,而不是PUT。

        // POST api/user
    public void Post(User user)
    {
    }

    // PUT api/user/5
    public void Put(User user)
    {
    }

Web api访问控制方法正在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-Request-Method", "GET ,POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin,Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "86400"); // 24 hours
            HttpContext.Current.Response.End();
        }
    }

不应该像PUT一样对PUT起作用。它是如何在IE中运行的?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我有这个工作。 angular2侧很好。 Web API需要修改。

我将BeginRequest更改为此

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
        {
            Response.Flush();
        }
    }

将CustomHeaders放回web.config

  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
  </customHeaders>

就是这样。