2010-12-15 5 views
3

でIndexOutOfRangeExceptionを返しI次のWebサービスを持っている:ASP.NET Webサービスは、引数

[ScriptService] 
public class Handler : WebService { 

    [WebMethod] 
    public void method1() { 

     string json = "{ \"success\": true }"; 

     System.Web.HttpContext.Current.Response.Write(json); 

    } 

    [WebMethod] 
    public object method2(Dictionary<string, object> d) { 

     Dictionary<string, object> response = new Dictionary<string, object>(); 

     response.Add("success", true); 

     return response; 

    } 

} 

第1の方法は、従来のHTMLフォームのポストを受け入れ、応答がページにJSON文字列を書き込みます。 2番目のメソッドは、AJAX経由でポストされたJSON値を受け取り、シリアル化されたオブジェクトを返します。

は、これらの両方の方法は、自分自身で問題なく動作しますが、同じWebサービスに一緒に入れたときに法1を呼び出すときに、私はこのエラーを取得:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 

私は、彼らが働く方法2から引数を削除します。

これはなぜ起こっているのでしょうか?

編集:

問題は、方法2の引数の型からまたがります。文字列や単純なデータ型に変更するとうまく動作します。ジョエルが示唆するように、おそらくディクショナリはシリアル化できないからです。これは、ajaxによって送信されたリクエストには影響しないように見え、フォーム・ポストをこのハンドラに分割するだけです。したがって、私の回避策は、フォームポストハンドラを別のファイルに置くことです。理想的ではありませんが、私のアプリケーションのために働く

+2

http://stackoverflow.com/questions/67959/c-xml-serialization-gotchas返信用 –

答えて

4

辞書はシリアライズできません。オブジェクトの後ろに隠すことはあなたのために何もしません。辞書を送信する前に、まず辞書を配列やその他のシリアライズ可能なオブジェクトに変換する必要があります。

Why isn't there an XML-serializable dictionary in .NET? http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx http://www.tanguay.info/web/index.php?pg=codeExamples&id=333

+0

おかげで、私はいつもこのようなJSONを返してきたし、動作しているようです辞書内のオブジェクトがシリアライズ可能である限り、問題はありません。これが上記の問題の背景にあるのかどうかはわかりません。 – markvpc

+0

@ CL4NCY - テストとして、戻り値の型とオブジェクトを 'List 'に変更し、エラーをスローします。それが辞書でない場合は、同じエラーが発生するはずです。 –

+0

戻り値の型はエラーに影響しないようですが、method2の引数には影響しません。私はそれらを削除するか、 'Dictionary d'の代わりに 'string d'に変更すると動作します。私はmethod2がmethod1を呼び出すことにどのように影響するか理解していません。 – markvpc

関連する問題