Десериализовать поток байтов пользовательского типа файла в объект POCO в .Net Core - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно прочитать пользовательский тип файла в приложение .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 # для выполнения преобразования; однако я не уверен, как обойти эту проблему.

Вопросы: Как я могу прочитать в пользовательском типе файла? Есть ли способ сделать это без использования потока или я должен определить свой собственный десериализатор? Если нет, то есть ли пример, на который я могу посмотреть, чтобы понять, во что я ввязываюсь?

1 Ответ

0 голосов
/ 03 ноября 2018

Мне нужно прочитать в пользовательский тип файла

Пока в .NET нет встроенной реализации или нет библиотеки, которая реализует конкретный тип файла, который вы используете, вам необходимо самостоятельно анализировать содержимое и интерпретировать каждый байт / часть двоичного потока на основе определения этого пользовательского типа файла.

BinaryFormatter использует свой собственный формат, поэтому с ним можно десериализовать только тот контент, который был сгенерирован другим BinaryFormatter. Кроме того, двоичная сериализация в .NET не гарантируется для разных реализаций фреймворка. Таким образом, двоичный контент, сгенерированный .NET Framework, не обязательно может быть использован в .NET Core или Mono.

...