【问题标题】:如何使用 ASP.NET Core Web API 传输/接收原始字节数组?
【发布时间】:2017-09-02 04:15:46
【问题描述】:

我已经编写了我的第一个 ASP.NET Core Web API 服务器。路由正在工作并且正在发送/接收。我想发送一个原始字节数组以响应 Get 并且我想绕过任何序列化(以及我的 WPF 客户端中的任何反序列化)。例如,在我的服务器中:

[HttpGet("api/data")]
public Byte[] GetData()
{
    Byte[] data = new Byte[]{1, 2, 3, 4, 5};
    return data; // No JSON, BSON or anything else...just my array. Is it done this way?
}

在我的 WPF 客户端中,我想使用 HttpClient 类来接收数组 - 不需要反序列化:

// Assume an instantiated and initialized HttpClient object called "httpCLient"
HttpResponseMessage response = httpClient.GetAsync("/api/data").Result;
// Now what?

我在互联网上搜索过,但没有找到这方面的例子,而且我自己也无法弄清楚。有人可以告诉我这是怎么做的吗?

更新:我相信客户端 Byte[] 检索可以通过“HttpContent.ReadAsByteArrayAsync()”完成,如下所示:Convert HttpContent into byte[]。但是,我仍然不确定如何从 ASP.NET Core Web API 端发送原始(未序列化)Byte[]

【问题讨论】:

  • 谢谢科林。我认为在客户端我可以通过以下方式检索 Byte[]: Byte[] data = httpResponseMessage.Content.ReadAsByteArrayAsync().Result;但是,我无法对此进行测试,因为我仍然不确定如何从服务器发送原始 Byte[]。
  • stackoverflow.com/questions/23884182/… 检查 Luaan 的答案。使用 ByteArrayContent
  • 谢谢马库斯。不幸的是,Luaan 的回答是使用“HttpResponseMessage”类。 .NET Core 似乎不支持这种类型......至少我在文档中找不到它的提及。
  • @LKeene 您只需向 System.Net.Http NuGet package 添加一个引用即可在您的 ASP.NET 核心项目中访问它。

标签: c# asp.net-core


【解决方案1】:

好的,多亏了我得到的输入,我得到了以下确实传输具有正确值的数组:

在服务器端(ASP.NET Core web api):

[HttpGet("/api/data")]
public async Task GetData()
{
    await Response.Body.WriteAsync(myByteArray, 0, myByteArray.Length);
}

在我的 WPF 客户端上:

HttpResponseMessage response = httpClient.GetAsync("/api/data").Result;
Byte[] data = response.Content.ReadAsByteArrayAsync().Result;

坦率地说,我不明白这是如何工作的(什么是“Response.Body.WriteAsync...”),我不喜欢盲目地使用“正常工作,继续前进”的代码。有人可以解释一下这是如何工作的,或者即使这是正确的方法?

另外,这实际上是绕过序列化/反序列化吗?我问是因为当客户端和服务器都在同一台机器(本地主机)上运行时,它大约需要。检索长度为 4,194,304 的 byte[] 需要 75 毫秒……这只有 4MB 左右,对于原始字节传输来说似乎相当慢。

【讨论】:

  • 你如何做相反的事情:将原始字节数组发布到服务器?
  • 是的,这是绕过序列化。当您使用返回ActionResult 对象的正常模式时,Response.Body.WriteAsync 与框架最终使用序列化数据调用的相同。它可能很慢,因为您在调试器中运行调试版本?
  • 需要修复的一件事是将“async void”更改为“async Task”。
【解决方案2】:

您可以在 JSON 对象中发送字节数组。我不确定你在问什么,但如果你正在寻找某种形式的双工通信,我会研究 SignalR。

如果您想使用从多种类型的系统编写的 API,我建议将字节数组打包在 JSON 对象中以实现互操作性。

希望能回答你的问题!

【讨论】:

  • 抱歉,我刚刚注意到您在代码中的注释说没有 JSON!
  • Eeewwww.. JSON 中的字节数组!?哦等等.. BSON。嗬!啊哈哈-您错过了重点,OP 正在努力返回原始字节。只是返回类型为 byte[] Base64Encodes 结果..在我的情况下,序列化器是整个 http 响应消息。哦!
  • 好的,当您使用 JavaScript 客户端使用它并且希望所有内容都以相同的方式格式化时怎么办?我只说 JSON,因为我编写的 API 总是以某种标准格式返回。
  • 但是我明白你的意思,我误解了 OP,我只是说我写我的 web 后端来为我的 JS 前端用 JSON 进行通信。
  • 是的,这很公平,我也这样做。但是我遇到这个问题的原因是因为我想返回原始字节,因为客户期望这个,例如一些客户想要 XML 而其他人想要 TLV Wire Protocols 等等。关于如何覆盖所有花哨的东西并不是很明显核心中的序列化器东西只是转储字节而不做任何“中间件”Base64,XML / JSON解析..只是..给我..da..字节! :D
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2019-05-02
  • 2014-11-18
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多