我需要从HttpPost
调用中将自定义文件类型读入.Net Core应用程序。当前的路由代码如下:
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#进行转换的类型信息;它是C#进行转换所必需的。但是我不确定如何解决这个问题。
问题: 如何读取自定义文件类型?有没有一种方法可以不使用流,还是必须定义自己的解串器?如果没有,有没有一个例子可以让我知道我要怎么做?
答案 0 :(得分:2)
我需要读取自定义文件类型
只要.NET中没有内置实现或没有实现您使用的特定文件类型的库,您就需要自己解析内容并根据定义自己解释二进制流的每个字节/部分自定义文件类型。
BinaryFormatter
使用其自己的格式,因此您只能将由另一个BinaryFormatter
生成的内容反序列化。同样,不能保证.NET中的二进制序列化可以在不同的框架实现中工作。因此,由.NET Framework生成的二进制内容不一定可以在.NET Core或Mono上使用。