如何解决使用 MultipartContent - IOException:无法从传输连接读取数据
当我使用 HttpClient 将表单数据发送到另一个 api 时收到此错误:
我在另一个 api 控制器上有这个参数:
public class IntegracaoArquivosDigitaisDto
{
/// <summary>
/// IdInteral do arquivo digital
/// </summary>
/// <example>1</example>
public int IdInternalArquivoDigital { get; set; }
/// <summary>
/// Chave do Módulo
/// </summary>
/// <example>
/// RecursosHumanos
/// </example>
public string ChaveModulo { get; set; }
/// <summary>
/// Versão do Módulo
/// </summary>
/// <example>
/// 1.6
/// </example>
public int? Versao { get; set; }
/// <summary>
/// Versão dos Dados enviados para processamento
/// </summary>
/// <example>
/// c8283005-68f5-41bf-aea6-29496068656c
/// </example>
public Guid IdProcessamento { get; set; }
/// <summary>
/// Colunas chaves
/// </summary>
public List<PayloadDTO> ColunasChaves { get; set; }
/// <summary>
/// Tipo de operação - I,A,E
/// </summary>
/// <example>1</example>
public string TipoOperacao { get; set; }
/// <summary>
/// Id arquivo Digital
/// </summary>
/// <example>1</example>
public string IdArquivoDigital { get; set; }
/// <summary>
/// Nome Arquivo
/// </summary>
/// <example>teste.pdf</example>
public string NomeArquivoDigital { get; set; }
/// <summary>
/// Arquivo
/// </summary>
public IFormFile Arquivo { get; set; }
}
public class PayloadDTO
{
/// <summary>
/// Nome do campo
/// </summary>
/// <example>
/// Cidade
/// </example>
public string Campo { get; set; }
/// <summary>
/// Valor representativo do campo
/// </summary>
/// <example>José da Silva</example>
public string Valor { get; set; }
/// <summary>
/// Tipo do dado
/// </summary>
/// <example>int</example>
public string Tipo { get; set; }
}
我是控制器:
[HttpPost]
public async Task<IActionResult> Teste([FromForm] IntegracaoArquivosDigitaisDto dto)
{
var json = JsonSerializer.Serialize(dto,new JsonSerializerOptions
{
WriteIndented = true,});
return Ok(json);
}
我尝试使用 StringContent、Json、FormUrlEncodedContent 和 MultipartFormDataContent,但不起作用。
使用带有这些参数的 httpClient 发布表单数据的正确方法是什么?
这是我的实现测试:
[HttpGet]
public async Task<IActionResult> Get()
{
string url = "http://localhost:5001/teste";
using (MultipartFormDataContent formDataContent = new MultipartFormDataContent())
{
var obj = new
{
IdInternalArquivoDigital = 3,ChaveModulo = "RecursosHumanos",Versao = 3,IdProcessamento = Guid.NewGuid(),ColunasChaves = new List<PayloadDTO>{
new PayloadDTO{
Campo="CdCategoria",Tipo= "int",Valor= "32",},new PayloadDTO{
Campo="Id",Valor= "3",new PayloadDTO{
Campo="Nome",Tipo= "strig",Valor= "Samuel",TipoOperacao = "I",IdArquivoDigital = Guid.NewGuid().ToString(),NomeArquivoDigital = "a7x.jg",};
var json = JsonSerializer.Serialize(obj,new JsonSerializerOptions { WriteIndented = true,});
//json content
// var jsonContent = new StringContent(json);
// jsonContent.Headers.ContentType = new MediaTypeHeaderValue("application/json")
// {
// CharSet = "utf-8"
// };
// Dictionary<string,string> dic = new Dictionary<string,string>();
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.Versao),obj.Versao.ToString());
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.IdArquivoDigital),obj.IdArquivoDigital.ToString());
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.IdInternalArquivoDigital),obj.IdInternalArquivoDigital.ToString());
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.IdProcessamento),obj.IdProcessamento.ToString());
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.ChaveModulo),obj.ChaveModulo);
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.NomeArquivoDigital),obj.NomeArquivoDigital);
// dic.Add(nameof(IntegracaoArquivosDigitaisDto.TipoOperacao),obj.TipoOperacao);
// formDataContent.Add(new FormUrlEncodedContent(dic),"dto");
// formDataContent.Add(new StringContent(obj.Versao.ToString()),nameof(IntegracaoArquivosDigitaisDto.Versao));
// formDataContent.Add(new StringContent(obj.IdArquivoDigital.ToString()),nameof(IntegracaoArquivosDigitaisDto.IdArquivoDigital));
// formDataContent.Add(new StringContent(obj.IdInternalArquivoDigital.ToString()),nameof(IntegracaoArquivosDigitaisDto.IdInternalArquivoDigital));
// formDataContent.Add(new StringContent(obj.IdProcessamento.ToString()),nameof(IntegracaoArquivosDigitaisDto.IdProcessamento));
// formDataContent.Add(new StringContent(obj.NomeArquivoDigital),nameof(IntegracaoArquivosDigitaisDto.NomeArquivoDigital));
// formDataContent.Add(new StringContent(obj.TipoOperacao),nameof(IntegracaoArquivosDigitaisDto.TipoOperacao));
// formDataContent.Add(new StringContent(obj.ColunasChaves.ToString()),nameof(IntegracaoArquivosDigitaisDto.ColunasChaves));
// formDataContent.Add(new StringContent(obj.ChaveModulo),nameof(IntegracaoArquivosDigitaisDto.ChaveModulo));
formDataContent.Add(new MultipartFormDataContent(obj.ChaveModulo),nameof(IntegracaoArquivosDigitaisDto.ChaveModulo));
string caminhoArquivo = @"C:\Users\samue\OneDrive\Imagens\a7x.jpg";
using (var fileStream = new FileStream(caminhoArquivo,FileMode.Open))
{
try
{
using (MemoryStream ms = new MemoryStream())
{
await fileStream.copyToAsync(ms);
var bytes = ms.ToArray();
var fileContent = new ByteArrayContent(bytes);
//file content
// fileContent.Headers.Contentdisposition = new ContentdispositionHeaderValue("form-data")
// {
// FileName = "a7x.jpg"
// .Replace("(",string.Empty)
// .Replace(")",string.Empty)
// .Replace(" ",string.Empty),// Name = "arquivo",// };
formDataContent.Add(fileContent,nameof(IntegracaoArquivosDigitaisDto.Arquivo),"a7x.jpg");
_client.Timeout = TimeSpan.FromMinutes(2);
var res = await _client.PostAsync(url,formDataContent);
res.EnsureSuccessstatusCode();
}
}
catch (System.Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)
{
throw;
}
}
}
return Ok();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。