2010-12-15 8 views
3

Ich habe folgenden Web-Service:ASP.NET Web Service liefert IndexOutOfRangeException mit Argumenten

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

    } 

} 

Die erste Methode akzeptiert ein traditionelles HTML-Formular senden und Antwort schreibt auf der Seite einen JSON-String. Die zweite Methode akzeptiert einen JSON-Wert, der über AJAX gesendet wird, und gibt ein serialisiertes Objekt zurück.

Beide Methoden funktionieren auf ihre eigenen, aber wenn sie in der gleichen Web-Service zusammen bekomme ich diesen Fehler, wenn method1 Aufruf:

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

Wenn ich die Argumente aus method2 sie arbeiten zu entfernen.

Kann jemand vorschlagen, warum dies geschieht?

Edit:

Das Problem erstreckt sich von dem Argument Art von method2. Wenn ich es in einen String oder einen einfachen Datentyp ändere, funktioniert es gut. Wie Joel vermutet, liegt es wahrscheinlich daran, dass Wörterbücher nicht serialisiert werden können. Dies scheint meine von ajax gesendeten Anfragen nicht zu beeinflussen und bricht nur direkte Formular-Posts mit diesem Handler ab. Daher besteht meine Problemumgehung darin, die Formularnachbehandlungsroutinen in einer separaten Datei zu speichern. Nicht ideal, aber funktioniert für meine Anwendung.

+2

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

Antwort

4

Wörterbücher sind nicht serialisierbar. Es hinter einem Objekt zu verstecken, tut nichts für dich. Sie müssen zuerst Ihr Wörterbuch in ein Array oder ein anderes serialisierbares Objekt konvertieren, bevor Sie es senden.

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

Danke für die Antwort, habe ich immer wieder json diese Art und Weise und es scheint zu funktionieren solange die Objekte im Dictionary serialisierbar sind. Ich bin mir nicht sicher, ob dies der Grund für das obige Problem ist. – markvpc

+0

@ CL4NCY - Als Test, ändern Sie den Rückgabetyp und Ihre Objekte in 'List ' und sehen, ob es einen Fehler verursacht. Wenn es nicht das Wörterbuch ist, sollten Sie den gleichen Fehler erhalten. –

+0

Der Rückgabetyp scheint den Fehler nicht zu beeinflussen, aber die Argumente für method2. Wenn ich sie entferne oder sie in "string d" anstelle von "Dictionary d" ändere, funktioniert es. Ich verstehe nicht, wie sich Methode2 auf das Aufrufen von Methode1 auswirken kann. – markvpc