Мне нужно прочитать пользовательский тип файла в приложение .Net Core из вызова HttpPost
. Текущий код маршрута выглядит следующим образом:
using Microsoft.AspNetCore.Mvc;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading.Tasks;
namespace Path.To.Controllers
{
public class TransformationController : BaseController
{
public TransformationController()
{
}
[Route("transform")]
[Consumes("application/octet-stream")]
[HttpPost]
public async Task<IActionResult> Transform()
{
using (var ms = new MemoryStream(2048))
{
var formatter = new BinaryFormatter();
await Request.Body.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
SomeType poco = null;
try
{
poco = (SomeType)formatter.Deserialize(ms);
}
catch (Exception e)
{
return BadRequest(e);
}
return Ok(poco);
}
}
}
}
Тем не менее, я получаю следующую ошибку из моего POST:
The input stream is not a valid binary format. The starting contents (in bytes) are: 43-54-30-30-31-20-20-20-20-20-20-20-20-20-20-20-20 ..."
Почтовый звонок:
POST /transform HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 46848
Authorization: bearer REDACTED
Origin: http://localhost:9001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
DNT: 1
Content-Type: application/octet-stream
Accept: */*
Referer: http://localhost:9001/iframe.html?
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Теперь я считаю, что источником проблемы является то, что поток байтов не содержит информацию о типе для C # для выполнения преобразования; однако я не уверен, как обойти эту проблему.
Вопросы:
Как я могу прочитать в пользовательском типе файла? Есть ли способ сделать это без использования потока или я должен определить свой собственный десериализатор? Если нет, то есть ли пример, на который я могу посмотреть, чтобы понять, во что я ввязываюсь?