.NET MVC从JSON Uint8Array反序列化字节数组

use*_*447 4 javascript asp.net-mvc-4

我在我的客户端Web应用程序上使用js-scrypt(https://github.com/tonyg/js-scrypt)来哈希和盐密码,然后将它们发布到我的服务器端.NET MVC应用程序进行哈希处理再次腌制.此JavaScript库将字节数组实现为JavaScript Uint8Arrays.如何让我的MVC控制器将我的JSON Uint8Array反序列化为byte []?

JavaScript示例:(AJAX.Post是我写的库,myUint8Array正确序列化)

AJAX.Post('www.example.com/SendByteArray', { myByteArray: myUint8Array }, Callback);
Run Code Online (Sandbox Code Playgroud)

C#示例:(在我的默认控制器中)

[HttpPost]
public async Task<JsonResult> SendByteArray(byte[] myByteArray) {

}
Run Code Online (Sandbox Code Playgroud)

在此示例中,myByteArray始终为null.我尝试了几种不同的方法,基于转换为字符串,然后返回到byte [],但我无法获得正确的值.如果我能够以某种方式直接将代码实现到.NET的JSON解串器中以便上面的代码完全按原样工作,那将是非常优选的,因为我有一些其他项目,如果我可以直接传递字节数组,我可以做一些很酷的事情服务器端和客户端应用程序.

use*_*447 6

现在我唯一可以使用的方法是对Uint8Array进行base64编码,将其作为C#中的字符串捕获,然后将该字符串转换为byte [].

JavaScript的:

AJAX.Post('www.example.com/SendByteArray', { strByteArray: btoa(String.fromCharCode.apply(null, myUint8Array)) }, Callback);
Run Code Online (Sandbox Code Playgroud)

C#:

[HttpPost]
public async Task<JsonResult> SendByteArray(string strByteArray) {
    byte[] myByteArray = Convert.FromBase64String(strByteArray);
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*nos 1

更改您的控制器操作以接受代替int[]byte[]然后转换为字节数组。post 值仍然可以是 JSON 数组。

[HttpPost]
public async Task<JsonResult> SendByteArray(int[] myByteArray) {

     byte[] theBytes = myByteArray.Select(i => (byte)i).ToArray();

     // Or any one of a dozen other ways of converting it

}
Run Code Online (Sandbox Code Playgroud)

为了发布到字节数组,您必须在客户端对字节进行 base-64 编码,并将其作为字符串传递。

可能还有其他选择,例如过滤器或属性或类似的东西,但这是我所知道的最简单的方法。