调用.net web api时,Angular Delete方法不传递飞行前请求
Posted
技术标签:
【中文标题】调用.net web api时,Angular Delete方法不传递飞行前请求【英文标题】:Angular Delete method doesn't pass pre-flight request when calling .net web api 【发布时间】:2019-09-22 01:37:53 【问题描述】:我在 UsersController 上有删除方法:
public async Task<IHttpActionResult> DeleteUser(Guid id)
User user = await db.Users.FindAsync(id);
if (user == null)
return NotFound();
db.Users.Remove(user);
await db.SaveChangesAsync();
return Ok();
我已经通过安装包启用 Cors,在 WebApiConfig 中启用 cors 并将其添加到 web.config 中:
<system.webServer>
<httpProtocol>
<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, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
我在前端使用 Angular,并且我有需要删除方法的服务:
public delete = (route: string) =>
return this.http.delete(this.createCompleteRoute(route, environment.urlAddress));
当我使用此函数拨打电话时,网址是:http://localhost:52474/api/Users/"some guid"
,但通话失败,说它没有通过飞行前请求。我需要在配置中添加其他内容吗?
【问题讨论】:
您是否正确定义了 DbContext 的 DI?由于 DI 的问题,我已经多次陷入这个问题。 不这么认为,因为当我尝试获取所有并获取方法时它工作正常:/ 好吧,所以我认为您从客户端发出的 http 请求可能有问题。我看到您在 web.config 中定义了“内容类型”,但在您的请求中您没有添加任何标题。尝试添加这样的标题: headers: new HttpHeaders( 'Content-Type': 'application/json' ) 作为 http.delete 方法的参数。 试过加了,还是一样:/ 你能把函数this.createCompleteRoute(route, environment.urlAddress)
的结果贴出来
【参考方案1】:
我注释掉了 web.config 中的设置,并在控制器顶部添加了[EnableCors("*", "*", "*")]
,现在它可以工作了。
【讨论】:
所以问题出在 这行,也许你没有从客户端正确设置标题,因为使用此过滤器,您可以允许任何标题。以上是关于调用.net web api时,Angular Delete方法不传递飞行前请求的主要内容,如果未能解决你的问题,请参考以下文章
在不同的端口上运行 Angular UI 和 Asp.net Web Api
Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权
在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*
在同一个端口上运行 Angular 和 ASP.NET Web API