7

クライアント側の Web アプリケーションでjs-scrypt ( https://github.com/tonyg/js-scrypt ) を使用して、パスワードをハッシュおよびソルトしてから、サーバー側の .NET MVC アプリケーションにポストしてハッシュし、再び塩漬け。この JavaScript ライブラリは、バイト配列を JavaScript Uint8Arrays として実装します。MVC コントローラーで JSON Uint8Array をバイト [] に逆シリアル化するにはどうすればよいですか?

JavaScript の例: (AJAX.Post は私が書いたライブラリで、myUint8Array は適切にシリアル化されます)

AJAX.Post('www.example.com/SendByteArray', { myByteArray: myUint8Array }, Callback);

C# の例: (私のデフォルトのコントローラーで)

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

}

この例では、myByteArray は常に null です。文字列に変換してから byte[] に戻す方法をいくつか試しましたが、正しい値を取得できませんでした。上記のコードがそのまま正確に機能するように、コードを .NET の JSON デシリアライザーに直接実装できれば非常に好ましいでしょう。サーバー側とクライアント側のアプリケーション。

4

7 に答える 7

6

今のところ、Uint8Array を base64 でエンコードし、C# で文字列としてキャプチャしてから、その文字列を byte[] に変換する方法しかありませんでした。

JavaScript:

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

C#:

[HttpPost]
public async Task<JsonResult> SendByteArray(string strByteArray) {
    byte[] myByteArray = Convert.FromBase64String(strByteArray);
}
于 2013-07-25T14:47:21.753 に答える
4

私は同じ問題に直面し、多くの研究開発を行いました。私はいくつかの結論に達しました。

アプローチ 1: C# は JavaScript 型の配列 (UInt8Array、UInt16Array など) を逆シリアル化できません。型付き配列から通常の Java スクリプト配列にデータをコピーし、そのデータを送信する必要があります。受信側 (C# エンドポイント メソッド) では、パラメーターはバイト配列ではなく整数配列である必要があります。バイト配列が配置されている場合、データは終点で null として受信されます。受信した整数配列は、ファイルを復元するためにバイト配列に変換する必要があります。

アプローチ 2: JavaScript の型付き配列データを通常の配列にコピーする代わりに、型付き配列データを送信する別のオプションは、型付き配列データをそのまま送信し、受信側 (C# エンドポイント メソッド) でメソッド パラメーターをオブジェクトにする必要があります。このオブジェクトは、いくつかの linq を使用して反復処理する必要があり、ファイルを回復するためにバイト配列に変換する必要があります。

どちらも上記で発見されたアプローチであり、私によれば非常に遅いです。サイズがそれぞれ 5MB のファイルを 3 つ送信すると、ブラウザ (IE 10 ブラウザ) のメモリ消費量が、Ajax リクエストを介してデータを送信するときに指数関数的に増加しました。私はまだ問題を理解することができません。誰かが Ajax を使用してバイト配列を送信できる場合は、私に知らせてください。

アプローチ 3: 3 番目のアプローチは、バイト配列を base64 でエンコードされた文字列に変換して送信することです。これによりファイル サイズが 33% 増加しますが、このアプローチは 2 つ以上のアプローチよりもはるかに優れています。15MBのファイルも問題なく送信でき、ブラウザのメモリ消費量はこの3ファイル送信時の80MB程度で、ファイル送信後は消費量が少なくなります。

重要:ファイルの内容を読み取った後、変数のメモリの割り当てを解除してください。IE のガベージ コレクションはあまり良くありません。fileReader を使用してファイルを読み取った後、メモリ消費に関する多くの問題に直面しました。ファイルの未使用の変数とバイト配列の内容が不要になったら、それらの割り当てをすべて解除します。

間違っている場合はお知らせください。

于 2014-10-17T18:34:32.847 に答える
2

サーバー側を変更できなかったため、byte[]サーバーのエンドポイントで型を保持する必要がありました。これを解決するために、最終的に myUint8Arrayを単純なバイト配列に変換しました。これは、JSON がオブジェクトではなく配列として解析します。

            const byteArray = [];
            Object.keys(contentUint8Array).forEach((key) =>{
                const byteForKey = contentUint8Array[key];
                byteArray.push(byteForKey);
            });

Byteこのようにして、.Net エンドポイントは配列にデシリアライズできました。

于 2018-04-11T11:51:29.797 に答える
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

}

バイト配列に投稿するには、クライアントでバイトを base-64 エンコードし、文字列として渡す必要があります。

フィルターや属性などの代替手段があるかもしれませんが、これが私が知っている最も簡単な方法です。

于 2013-07-24T21:39:12.357 に答える
0

Jason.stringifyを使用してシリアライズし、ajax の一部の属性を設定する必要があります。これは私が使用して動作する例です

            var list = [];

           //Fill list array

            var parameters = {};
            parameters = JSON.stringify({ "Your parameter": list });
            jQuery.ajax({
                url: '@Url.Action("Your Action")';,
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                dataType: "html",
                traditional: true,
                data: parameters,
                success: function (data, textStatus, jqXHR) {
                   //TODO: on success
                },
                error: function (data) {
                       //TODO: on fail
                }    
            });

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

    }

     OR Do this Way

    [HttpPost]
    public async Task<JsonResult> SendByteArray(int[] myByteArray) {
      convert to byte here
    }
于 2016-01-01T10:58:49.323 に答える
0

user1084447 (base64 文字列へのシリアル化と逆シリアル化) のソリューションに基づいて構築すると、これはシリアル化に非常に適しています。

var serialized = fromByteArray(myUint8Array);

fromeByteArray関数がこの github projectから来るところ。mdn のこのドキュメントから base64-js について学びました。

于 2017-05-15T11:46:23.833 に答える