提问者:小点点

您能序列化转换为C#对象的JSON中的ByteArrayContent吗?


我在VS Studio中编写了一个C#Web API,并创建了许多DTO,这些DTO被序列化为任何客户端都可以使用的JSON实体。我的一个API调用是返回一个PDF文件,所以经过一些在线研究,我设置了其中一个DTO是以以下格式设置的。我在某处读到你可以做到这一点,但不是百分之百确定:

public class MyCustomResult
{
   public bool Success;
   public DateTime? LastRunDate;
   public string ErrorCode;
   public string Message;
   public ByteArrayContent ReportBody;
}

当将对象作为IHttpActionResult返回时,我不会得到任何错误:

返回确定(结果);

我可以在服务器上看到报告byte[]的字节大小约为700K。但是,当我在客户机上检索对象时,JSON实体大约是400B,BytecontentStream中没有字节内容。当我在Postman中运行查询时,我得到一个空的头,因此看起来ByteContentStream不能被Newtonsoft JSON序列化。

有什么我应该考虑的选择吗?


共1个答案

匿名用户

下面是使用ByteArrayContent的场景:

using(var req = new HttpRequestMessage(HttpMethod.Post, new Uri("https://example.com"))
{
    req.Content = new ByteArrayContent(...);
    using(var resp = await _client.SendAsync(req))
    {
        var data = await resp.Content.ReadAsAsync<object>();
    }
}

你想做的是:

public class MyCustomResult
{
   public bool Success;
   public DateTime? LastRunDate;
   public string ErrorCode;
   public string Message;
   public byte[] ReportBody; // <-- change this to byte[]
}

var dataToSend = new MyCustomResult(); // fill this in

using(var req = new HttpRequestMessage(HttpMethod.Post, new Uri("https://example.com"))
{
    req.Content = new StringContent(
        JsonConvert.SerializeObject(dataToSend, Encoding.UTF8, "application/json"));
    using(var resp = await _client.SendAsync(req))
    {
        var data = await resp.Content.ReadAsAsync<object>();
    }
}

(注:此代码未经测试)

因此,将发生的情况是serializeobject将该字节数组转换为Base64字符串,然后将其发送。

然后,使用者必须对Base64字符串进行解码。如果它是另一个NewtonSoft.json客户机,并且模型定义匹配,那么它会自动为您解码。

我知道你正在做一个API端点。上面的示例是为了展示ByteArrayContent的用法以及它为什么存在于.NET中。返回数据的方式是正确的:返回Ok(响应);只要修复了模型。

所以总结一下:

ByteArrayContentHttpContent的一个实现,它应该只用作响应体。它不能与JSON响应结合使用。