2017-06-23 10 views
1

JavaScriptを使用してWebMethodにバイトの配列を渡そうとしています。 問題は、WebMethodが「テストフォームはプリミティブメソッドに対してのみパラメータとして使用可能です」というメッセージとともに返されることです。WebMethodで非プリミティブデータを受け取るには?

データ型を文字列または他の種類のプリミティブ変数に変更すると、WebMethodはそれを受け入れます。

私はオブジェクトをbyte []に​​変換しています。これはMessagePack(変換自体がうまくいく)を使用してmsgpackEnvioと名前をつけ、WebServiceに送信します。

は、ここで使用してWebサービスへの私の要求jQueryの

$.ajax({ 
        beforeSend: function (request) { 
         request.setRequestHeader("Content-Type", "application/json"); 
        }, 
        processData: false, 
        dataType: "json", 
        url: url, 
        data: msgpackEnvio, 
        type: "POST", 
        error: function (data) { 
         $('#upload-load').hide(); 
         $('.bt-enviar-excel').removeAttr('disabled', 'disabled'); 
         var msg = document.getElementsByClassName('msg')[0]; 
         msg.style.color = 'red'; 
         msg.innerHTML = 'Erro interno servidor!'; 
        }, 
        success: //some code 

実際には、上記のコードは、私の問題は、webサービスですべての事項であるしない、そしてそれは、配列またはおそらくオブジェクトを受け取るようにする方法。ここ

とは、[]

[WebMethod] 
public string TestMessagePack(byte[] name) 
{   
    //my code 

    return "Finish"; 
} 

答えて

0

バイトを受け取ることができるはず私のWebMethod属性は、あなたが文字列としてバイト配列を送信するためにbase64エンコーディングとデコーディングを使用することができます。それ以上のものなら、ポストリクエストやJSONのシリアル化/デシリアライゼーションを代わりに使用することもできます。複雑なC#オブジェクトとjavascriptオブジェクトの間のすべての変換に適合する一般的な1つのサイズは存在しません。なぜなら、プリミティブなパラメータのみが許可されているからです。これは、通常、何らかの形の文字列の直列化と逆シリアル化を意味します。

+0

私はそれを試しましたが、私が解決したい問題はまさにこの問題です。いくつかのオブジェクトを読み込むと、私のjsonは非常に大きいので、WebServiceへの接続には時間がかかり、接続に時間がかかることもあります。 私は本当に非プリミティブを受け取るためにWebServiceメソッドを変更する必要があります –

+0

JavaScriptはどのようにしてC#が理解できる非プリミティブオブジェクトを構築することができますか?複雑なオブジェクトは、ボンネット内で実際にどのように見えるかという点で、言語と環境に依存することになるので、そのギャップを埋めるために、シリアル化が活発になります。複雑なオブジェクトは、どちらか一方の方法で、両方のレイヤーが対処する方法を知っているプリミティブ型の文字列にシリアル化して、文字列から受信した複雑なオブジェクトに戻して逆シリアル化する必要があります。 JSON/XML/etcとbase64はあなたの友人です。 –

+0

シンプルな型の中には、自動的にシリアライズおよびデシリアライズすることができますが、これは私が頼りにするものではありませんが、複雑になるとjsonやxmlのようなものに移動する必要があります。このエラーメッセージはどこから来たのですか?これは参照されたコードにはなく、標準的なエラーメッセージではありません。 –

関連する問題