【发布时间】:2019-08-18 08:39:20
【问题描述】:
我正在尝试使用 multipart/form-data 从 Angular 6 应用程序向 ASP.NET Core 中的 REST 服务发出 POST 请求,但出现错误 500。我尝试了太多解决方案,但没有任何效果。我尝试在 Postman 上执行请求并遇到同样的问题,但我尝试在其他名为 ARC(高级 REST 客户端)的软件中运行,效果非常好,但我不知道为什么。
在服务器端,我收到 InvalidDataException:缺少内容类型边界。在我的项目中,我也在使用 swagger
这是我的代码
角度请求:
public uploadPlanilha(planilha: File, idLote: number): Observable<Array<RequisicaoComposicao>>{
let formData = new FormData();
formData.append('arquivo', planilha, planilha.name);
formData.append('idLote', idLote.toString());
let httpHeaders = new HttpHeaders();
httpHeaders = httpHeaders.set("Content-Type", "multipart/form-data");
return this.httpClient.post<Array<RequisicaoComposicao>>(`${this.API_URL}requisicoes/upload`, formData, {
headers: httpHeaders
});
}
Web Api 中的控制器方法
[HttpPost]
[Route("upload")]
[Consumes("multipart/form-data")]
[DisableRequestSizeLimit]
public ActionResult<List<RequisicaoComposicao>> PostPlanilhaRequisicoes([FromForm]ArquivoDto arquivoDto)
{
try
{
using (Stream arquivoPlanilha = arquivoDto.Arquivo.OpenReadStream())
{
List<RequisicaoComposicao> requisicaoComposicoes = _composicaoGestor.Inserir(arquivoPlanilha, int.Parse(arquivoDto.IdLote));
return Ok(requisicaoComposicoes);
}
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
ArquivoDto 类
public class ArquivoDto
{
public IFormFile Arquivo { get; set; }
public string IdLote { get; set; }
}
【问题讨论】:
-
HttpHeaders是不可变的,您需要像let httpHeaders = new HttpHeaders().set("Content-Type", "multipart/form-data").set("Accept", "multipart/form-data");一样设置标头,否则每次调用set时都会返回一个HttpHeaders的新实例,并且您之前的标头会被覆盖。这就是为什么您没有在服务器上获得content-type标头的原因。 -
我改了这个,但还是不行。我尝试在标头上使用 Content-Type 并尝试不使用此参数,但一切正常。
-
尝试像
let httpHeaders = new HttpHeaders().set("Content-Type", "multipart/form-data")一样使用它,你不能重新分配httpHeaders变量。 -
另外,如果您使用的是
[FromForm],那么 Content-Type 应该是application/x-www-url-formencoded,但如果您只想发布文件,则删除[FromForm]并使用(IFormFile arquivoDto)作为参数,在这种情况下,内容类型应该是multipart/form-data
标签: c# angular asp.net-core asp.net-core-webapi