2010-12-15 83 views
3

je le service Web suivant:ASP.NET Web Service Réclamation IndexOutOfRangeException avec des arguments

[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; 

    } 

} 

La première méthode accepte un formulaire HTML traditionnel message et la réponse écrit une chaîne JSON à la page. La deuxième méthode accepte une valeur JSON publiée via AJAX et renvoie un objet sérialisé.

Ces deux méthodes fonctionnent bien sur leur propre, mais mis ensemble dans le même service web je reçois cette erreur lorsque vous appelez method1:

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

Lorsque je supprime les arguments de method2 ils travaillent.

Quelqu'un peut-il suggérer pourquoi cela se produit?

Edit:

Le problème va du type d'argument de method2. Si je le change en chaîne ou en type de données simple, cela fonctionne correctement. Comme le suggère Joel, c'est probablement parce que les dictionnaires ne peuvent pas être sérialisés. Cela ne semble pas affecter mes demandes envoyées par ajax et ne casse que les messages de forme directe à ce gestionnaire. Par conséquent, ma solution de contournement consiste à mettre les gestionnaires de publication de formulaire dans un fichier distinct par eux-mêmes. Pas idéal mais fonctionne pour mon application.

+2

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

Répondre

4

Les dictionnaires ne sont pas sérialisables. Le cacher derrière un objet ne fait rien pour vous. Vous devez d'abord convertir votre dictionnaire en tableau ou en un autre objet sérialisable avant de l'envoyer.

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

Merci pour la réponse, je l'ai toujours retourné JSON cette façon et il semble fonctionner bien tant que les objets du dictionnaire sont sérialisables. Je ne suis pas sûr si c'est la raison derrière le problème ci-dessus. – markvpc

+0

@ CL4NCY - En tant que test, changez le type de retour et vos objets en 'List ' et voyez si cela génère une erreur. Si ce n'est pas le dictionnaire, vous devriez avoir la même erreur. –

+0

Le type de retour ne semble pas affecter l'erreur mais les arguments de la méthode 2. Si je les supprime ou les change en 'chaîne d' au lieu de 'Dictionnaire d' alors ça marche. Je ne comprends pas comment method2 peut affecter l'appel de method1. – markvpc