【问题标题】:Transferring raw bytes over http using the ASP.Net WebAPI 2使用 ASP.Net WebAPI 2 通过 http 传输原始字节
【发布时间】:2017-03-09 10:46:26
【问题描述】:

我有一个非常简单的 ASP.Net WebAPI 2 方法,我希望它可以通过 HTTP 发送一个小的字节数组:

[Route("api/assemblybytes")]
public byte[] GetAssemblyBytes()
{
    //byte[] bytes = null;
    //if (File.Exists("BasePCBScreenAssembly.dll"))
    //{
    //    using (var fs = File.Open("BasePCBScreenAssembly.dll", FileMode.Open, FileAccess.Read))
    //    {
    //        fs.Read(bytes, 0, (int)fs.Length);
    //    }
    //}
    //return bytes;
    return new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
}

为了测试这个函数,我用一个包含字节 0x20 七次的简单数组替换了预期的代码(在上面注释掉了)。为了测试我的代码,我有一个简单的网页:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Assembly Distribution WebAPI Test Page</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
    <script>
        var uri = 'api/assemblybytes';
        $(document).ready(function () {
            $.getJSON(uri)
                .done(function (data) {
                    var bytes = [];
                    for (var i = 0; i < data.length; ++i) {
                        bytes.push(data.charCodeAt(i));
                    }
                    $('#AssemblyBytes').text(bytes)
                });
        });
    </script>
</head>
<body>
    <div>
        <h2>GetAssemblyBytes</h2>
        <pre id='AssemblyBytes'/>
    </div>
</body>
</html>

我希望使用网页来查看在字节数组的开头或结尾添加了哪些字节或文本。但相反,我看到了这个和返回到网页的字节:

73,67,65,103,73,67,65,103,73,65,61,61

所以我的 0x20(十进制的 32)甚至没有出现一次。

(注意,这似乎是一个人为的例子。实际的客户端不是网页,而是一个 .Net Micro Framework 嵌入式设备,它将(我希望)从 WebAPI 以字节数组的形式下载小型动态程序集。)

我做错了什么或遗漏了什么?使用 ASP.Net WebAPI 通过 HTTP 传输字节数组的最佳方式是什么?

【问题讨论】:

标签: c# asp.net-web-api


【解决方案1】:

如果您不返回 HttpResponseMessage,WebAPI 将根据 Accept 标头和安装的媒体类型格式化程序将值序列化为某种格式(JSON、XML 等)。

发送原始数据:

HttpResponseMessage res = CreateResponse(HttpStatusCode.OK);
res.Content = new ByteArrayContent(bytes);
return res;

或者,既然你有一个Stream

HttpResponseMessage res = CreateResponse(HttpStatusCode.OK);
res.Content = new StreamContent(File.Open(...));
return res;

【讨论】:

  • 这行得通,谢谢。我不得不将CreateResponse 更改为Request.CreateResponse。一件奇怪的事情是,虽然字节可以通过,但我只能在 getJSON 的 .fail 函数中获取它们,因为它会引发解析错误
  • 啊,当然。解析失败是因为 $.getJSON jquery 函数期望接收... JSON!呵呵。
猜你喜欢
  • 2017-09-02
  • 2021-01-23
  • 1970-01-01
  • 2014-02-18
  • 2014-02-21
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多