【发布时间】:2018-09-27 04:43:28
【问题描述】:
我正在开发一个 Web 应用程序,前端使用 Angular 6,后端使用 .NET Core Web API。
我正在设置 API 以使用我的 Angular 服务。我的字体端和后端项目位于不同的本地主机端口上,但我已经在我的 API 中启用了 CORS 用于开发目的。
services.AddCors(o => o.AddDefaultPolicy(builder =>
{
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
}));
使用此设置,我可以成功执行 GET 请求。例如,我的 Angular 服务:
getAllFiles():Observable<MediaFile[]> {
return this.http.get<MediaFile[]>(`${this.request_url}/files`)
}
可以调用我的 Web API 控制器:
[HttpGet]
public IEnumerable<MediaFile> GetFiles(string code = null)
{
if (code != null)
{
return context.Files.Where(file => file.Meeting.Code == code);
}
return context.Files;
}
并且成功地给了我我请求的媒体文件。
为简洁起见,我不会在此处包含它,但我为 POST 做了同样的事情,它按预期工作。
我正在尝试为 PUT 请求添加处理程序。以下是相关代码:
putFile(file:MediaFile):Observable<MediaFile> {
return this.http.put<MediaFile>(
`${this.request_url}/files/${file.id}`, file
)
}
在服务器端:
[HttpPut("{id}")]
public async Task<IActionResult> PutFile([FromRoute] int id, [FromBody] MediaFile file)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != file.Id)
{
return BadRequest();
}
context.Entry(file).State = EntityState.Modified;
try
{
await context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!FileExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
但是当我尝试执行这段代码时,浏览器会发送一个 HTTP OPTIONS 请求。一些谷歌搜索告诉我,这很可能是preflight request。然后它发现我的 API 中不存在 OPTIONS 方法,并返回 404。
我不明白为什么在这种情况下预检请求会失败。为什么我的 API 适用于 GET 和 POST 请求,但不适用于 PUT?有人可以解释一下这里可能出了什么问题。
谢谢!
【问题讨论】:
标签: javascript http asp.net-web-api .net-core angular6