2017-12-22 27 views
0

私は着信データを捕まえるだけのWebサービスを持っています。Webサービスに送信されたJSON配列の角括弧を処理する方法

ExceptionType : "System.InvalidOperationException" 
Message: "Type 'System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not supported for deserialization of an array." 
at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList) 
......... 

は、私はいくつかのテストを行なったし、それが文字列化されたJSON配列の括弧に関係しています:受信データが文字列化JSONの配列である場合、サーバは500レベルのエラーを返します。文字列化されたJSONオブジェクト(中括弧のみ)を送信すると、エラーは発生しません。私。 "{"id":111,"val":"x"}""[{"id":111,"val":"x"}]"

私は混乱していますが、私はWebメソッドでデシリアライズを行っていません。 リクエストにアクセスする前に、すべて上流に向かっています。ウェブ方法は以下の通りです:

[WebMethod] 
[ScriptMethod] 
public void CatchData() 
{ 
    HttpRequest inboundRequest = HttpContext.Current.Request; 

    System.IO.Stream stream = inboundRequest.InputStream; 
    stream.Position = 0; 
    string contents = ""; 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8)) 
    { 
     contents = reader.ReadToEnd(); 
    } 

} 

つの質問:

私は、Webメソッドは、文字列化JSONでブラケットを扱うことができるように変更するには何が必要ですか?

ここでは正確に何が起こっていますか? HttpContext.Current.Request.InputStreamがWebメソッドの上流の何かによって使用されていることを認識するまでにはしばらく時間がかかりました。その内容を再読み込みするには、その位置を0に設定する必要があります。コンテンツタイプapplication/jsonに設定されていますか?コンテンツタイプをapplication/textに設定すると、ストリームをリセットする必要はありません。

+0

は、アレイがあるが、配列内の唯一の1のオブジェクトがあるとき、あなたは、単一のオブジェクトをstrigifyingあなたが期待タイプのようですね。 –

答えて

0

あなたは明らかにリクエストを読み込んでいる上流にハンドラを設定しているはずです。私はwebmethodかscriptmethodのどちらかがハンドラを追加していると思いますが、もしあなたが複雑なプロジェクトに参加しているなら、httphandlerが動いているかもしれません。ソリューション全体についてもっと知ることなく、より良い答えは不可能です。

生の入力を自分で処理する場合は、httphandlerを作成して登録します。

関連する問題