Unexpected end of Stream, the content may have already been read by another component.

.NET Core

API

Postman

05/04/2019

Tenho uma API em .net core e estou com problemas para enviar um formulário com um anexo para o serviço.
Recebo o seguinte erro: 'Unexpected end of Stream, the content may have already been read by another component. '
Código da API:

namespace SISQUEST.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]
public class PostController : ControllerBase
{

HttpClient _httpClient = new HttpClient();

public PostController()
{
_httpClient.BaseAddress = new Uri("http://localhost:51102/api/");
//_httpClient.DefaultRequestHeaders.Accept.Add(
// new MediaTypeWithQualityHeaderValue("application/json"));
}

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[DisableFormValueModelBinding]
public async Task<ActionResult<QuestionarioModel>> CadastrarQuestionario([FromForm]QuestionarioModel questionarioModel)
{

string textMessage = String.Empty;
_httpClient.Timeout = TimeSpan.FromMinutes(20);
var httpClient = new HttpClient();

try
{

var myContent = JsonConvert.SerializeObject(questionarioModel);
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);

string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
byteContent.Headers.Remove("Content-Type");
byteContent.Headers.Add("Content-Type", "Multipart/form-data;boundary=" + boundary);

var response = await httpClient.PostAsync(_httpClient.BaseAddress + "CadastrarQuestionario", byteContent );
if (response.Content != null)
{
textMessage = await response.Content.ReadAsStringAsync();
return Ok(textMessage);
}

httpClient.Dispose();

}
catch (Exception e)
{
return BadRequest(e);
}

return Ok(textMessage);

}
}
}

Código do Serviço

[HttpPost]
public ActionResult CadastrarQuestionario()
{
var valido = true;
SubGrupoQuestionario subGrupo = new SubGrupoQuestionario();
List<SubGrupoQuestionario> SubGrupoValido = new List<SubGrupoQuestionario>();
Questionario questionario = new Questionario();
QuestionarioSubGrupo associacaoQuestionario = new QuestionarioSubGrupo();
IFormCollection nvc = HttpContext.Request.Form; //erro ocorre aqui
try
{
questionario.QstNom = nvc["nomeQuest"];
questionario.QstAtvSit = bool.Parse(nvc["situacaoQuest"]);
questionario.QstIclDat = DateTime.Now;
questionario.QstDisSit = true;
if (HttpContext.Request.Form.Files.Count == 0)
{
if (string.IsNullOrEmpty(questionario.QstNom) || questionario.QstNom.Trim() == "")
{
return BadRequest("É obrigatório criar um nome ou anexar uma imagem para a criação do questionário.");
}
else
{
var nome = _contextSisquest.Questionario.ToList();


foreach (var item in nome)
{
if (item.QstNom != null)
{
var nomeCadastrado = item.QstNom.Replace(" ", "").Trim();
var novoNome = questionario.QstNom.Replace(" ", "").Trim();

if (String.Compare(nomeCadastrado, novoNome, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0)
{
return BadRequest("Já existe um questionário com o mesmo nome.");
}
}
}
}
}
if (nvc["subGrupoQuest"] != "")
{
associacaoQuestionario.QstSboCod = short.Parse(nvc["subGrupoQuest"]);
}
associacaoQuestionario.QstGrpCod = short.Parse(nvc["grupoQuest"]);

string folderName = "Upload/Sisquest";
string webRootPath = _hostingEnvironment.WebRootPath;
string newPath = Path.Combine(webRootPath, folderName);

if (!Directory.Exists(newPath))
{
Directory.CreateDirectory(newPath);
}

List<QuestionarioAnexo> anexoQuest = new List<QuestionarioAnexo>();

for (int i = 0; i < HttpContext.Request.Form.Files.Count; i++)
{
string fileName = DateTime.Now.Ticks.ToString() + Path.GetExtension(ContentDispositionHeaderValue.Parse(HttpContext.Request.Form.Files[i].ContentDisposition).FileName.Trim('"'));
string extensao = Path.GetExtension(fileName);
string[] extensoesValidas = new string[] { ".jpeg", ".png", ".JPEG", ".PNG" };
if (HttpContext.Request.Form.Files[i].Length > 2097152)
{
valido = false;
return BadRequest("Tamanho máximo permitido para anexo é de 2MB");
}
else
{
if (!extensoesValidas.Contains(extensao))
{
valido = false;
return BadRequest("Extensão de arquivo não suportada");
}
else
{
string fullPath = Path.Combine(newPath, fileName);
using (var s = new FileStream(fullPath, FileMode.Create))
{
HttpContext.Request.Form.Files[i].CopyTo(s);
QuestionarioAnexo anx = new QuestionarioAnexo();

anx.QstAnxNom = fileName;
anx.QstAnxOrdNum = (byte)(i + 1);
anexoQuest.Add(anx);
}
}
}
}

if (valido == true)
{
if (associacaoQuestionario.QstSboCod != null)
{
SubGrupoValido = _contextSisquest.SubGrupoQuestionario.Where(x => x.QstGrpCod == associacaoQuestionario.QstGrpCod).ToList();
if (SubGrupoValido.Count > 0)
{
SubGrupoQuestionario sub = new SubGrupoQuestionario();
sub = _contextSisquest.SubGrupoQuestionario.Where(x => x.QstSboCod == associacaoQuestionario.QstSboCod).FirstOrDefault();
if (!SubGrupoValido.Contains(sub))
{
return BadRequest("SubGrupo não pertence a este Grupo");
}
else
{
_questionario.InsertQuestionario(questionario, associacaoQuestionario, anexoQuest);
}
}
else
{
return BadRequest("SubGrupo não pertence a este Grupo");}


Não pude colar todo o Código.
Thiago Romão

Thiago Romão

Curtidas 0
POSTAR