我在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序列化。
有什么我应该考虑的选择吗?
下面是使用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(响应);
只要修复了模型。
所以总结一下:
ByteArrayContent
是HttpContent
的一个实现,它应该只用作响应体。它不能与JSON响应结合使用。