我正试图让角度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中运行的?
有什么想法吗?
答案 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>
就是这样。