ASP.NET Web-Methode akzeptiert eine Liste<CustomObject> andernfalls mit "Web Service-Methode name ist nicht gültig."
Ich möchte erstellen Sie eine web-Methode akzeptiert eine Liste der benutzerdefinierten Objekte (übergeben in der via jQuery/JSON).
Wenn ich die website lokal alles scheint zu funktionieren. jQuery und ASP.NET und jeder ist glücklich. Aber wenn ich es auf einem unserer Server in die Luft sprengt. jQuery erhält einen 500-Fehler, nachdem der ajax-request mit Antwort:
System.InvalidOperationException: EditCustomObjects Web-Service-Methode name ist nicht gültig.
Hier ist die web-service-Methode:
[WebMethod]
public void EditCustomObjects(int ID, List<CustomObject> CustomObjectList)
{
//Code here
}
Und mein jQuery-code (was ich denke nicht Fragen, da der Fehler scheint passiert zu sein auf die web-service-Ebene):
var data = JSON.stringify({
ID: id,
CustomObjectList: customObjectList
});
$.ajax({
type: "POST",
url: "/manageobjects.asmx/EditCustomObjects",
data: data,
contentType: "application/json; charset=utf-8",
async: false,
dataType: "json",
success: function(xml, ajaxStatus) {
//stuff here
}
});
Den customObjectList initialisiert wird, etwa so:
var customObjectList = [];
Und ich Elemente hinzufügen, um es wie dies (über eine Schleife):
var itemObject = {
ObjectTitle = objectTitle,
ObjectDescription = objectDescription,
ObjectValue = objectValue
}
customObjectList.push(itemObject);
So, mache ich etwas falsch hier? Gibt es einen besseren Weg, der ein array übergeben von Daten von jQuery ein ASP.NET web-service-Methode? Gibt es eine Möglichkeit zur Behebung des "Web Service-Methode name ist nicht gültig." Fehler?
FYI, ich bin laufen .NET 2.0 auf einem Windows Server 2003-Maschine, und ich habe den code für die oben von dieser Seite: http://elegantcode.com/2009/02/21/javascript-arrays-via-jquery-ajax-to-an-aspnet-webmethod/
EDIT: Jemand beantragt, einige weitere info auf der web-Dienst, den ich lieber nicht die ganze Klasse, aber hier ist ein bisschen mehr, die helfen können:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ManageObjects : Custom.Web.UI.Services.Service
{
}
Bara
Würde ich eher nicht posten, das ganze web-service, aber siehe mein edit oben für ein bisschen mehr info auf die Initialisierung des web-service.
Starten Sie durch überprüfen, um zu sehen, ob die Methode tatsächlich nicht existieren auf den Produktions-server. Gehen Sie zu
http://mysite.com/manageobjects.asmx
und sehen, welche Methoden es Listen.Es gibt Sie, ich habe bereits überprüft, dass.
InformationsquelleAutor Bara | 2010-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich die assuption basierend auf Kommentare, die Sie können gehen Sie direkt zu den web-service im browser.
Nur zu isolieren, die das benutzerdefinierte Objekt von der Konfiguration, Sie könnten einen anderen Dienst im Ort wie:
Anruf, der von einem der client-Seite jQuery-ajax-call. Wenn das funktioniert, dann ist es wahrscheinlich rund um Ihr Objekt gezielt und nicht-Konfiguration auf der server-Seite. Ansonsten, Ausschau halten auf der server-Seite config Spur.
EDIT: Einige Beispiel-code:
Und hier ist ein Beispiel, wo ich post-ein komplexer Datentyp JSON-Wert
Diese tatsächlich enthält zwei arrays von Objekten innen... mein NewProcedureData Typ ist in einer Klasse definiert, die legt diese aus.
EDIT2:
Hier ist, wie ich handle, ein Komplexes Objekt in eine Instanz:
HINWEIS !WICHTIG die procedureSaveData name muss exakt auf die client-und server-Seite, damit Sie richtig funktionieren.
EDIT3: mehr code-Beispiel:
Hoffe, das hilft.
Super, also dann wissen wir, es hat zu tun mit den tatsächlichen Daten und nicht eine generische web-service - /config-Problem. SO, wir müssen dann serialisieren der Datenstruktur. Ich habe nicht verwendet die Struktur, die Sie haben, haben aber Arrays und komplexe Typen, dass ich in einer Klasse definiert...
Ist es möglich, verwendet ein array von CustomObject statt der Liste wie Sie Sie beschrieben haben?
Zum Beispiel, ich habe die MyObjectList.ToArray(); mit einer Methode wie: public MyObject [] GetMyObjectList(){....zurück MyObjectList.ToArray();}
Ich versuchte, Sie übergeben ein array statt einer Liste: public void EditCustomObjects(int ID, CustomObject[] CustomObjectList) aber habe den gleichen Fehler. Ich habe eine neue Klasse, die ein array enthält von CustomObject, dann legen Sie die EditCustomObjects Methode zu akzeptieren, die ein Objekt der Klasse, aber ich habe den gleichen Fehler noch einmal. Allerdings bin ich mir nicht sicher, ob ich vollständig verstanden, was dein Vorschlag ist.. Was genau enthalten ist, in NewProcedureData?
InformationsquelleAutor Mark Schultheiss
Da der Fehler erwähnt, ein problem mit der web-Methode den Namen, ich vermute, dies ist völlig aufgrund von Problemen, wie die WSDL generiert und zugeordnet, um die web-service. Ich sehe zwei mögliche Probleme:
ID
ist ein schrecklich gemeinsamen Namen und können reserviert werden oder kann zu Konflikten führen. Versuchen Sie esobjectId
(groß geschrieben werden die Namen der parameter sind nicht die norm .Eh NET)List<CustomObject>
oderCustomObject[]
möglicherweise in Konflikt mit Ihrer parameter nameCustomObjectList
. Versuchen Sie, die Umbenennung der zweite parametercustomObjects
statt.Oder vielleicht gibt es einige andere dumme framework-Fragen spielen hier. In jedem Fall sollten Sie auf Ihre Frage die WSDL generiert .NET. Sie können die WSDL-XML Download /manageobjects.asmx?WSDL von Ihrem web-server.
Toll. Versuchen Sie auch, die Buchung der
CustomObject
definition der Klasse als gut.InformationsquelleAutor Jacob
Möchten Sie vielleicht zu prüfen, Ihre webServices/Protokolle element in das system.Bereich der Website und sorgen dafür, dass HttpPost Hinzugefügt wird. In der Regel, lokale post ist standardmäßig aktiviert, Entwicklungs-Modus, aber nicht für die Fernbedienung, die ist, was es sein wird, wenn der Dienst auf dem server bereitgestellt wird...
Ich mehr ins detail gehen, hier
InformationsquelleAutor Sky Sanders
Vielleicht ist der Pfad, den Sie übergeben, mit jquery nicht vorhanden ist, versuchen, um die Reaktion mit FireBug.
haben Sie bestätigt, dass die URL des ajax-request erzeugt existiert?
Ja, die URL absolut vorhanden ist.
Haben Sie versucht, um zu sehen, die ajax-Anfrage mit FireBug-Konsole...
InformationsquelleAutor Shakeeb Ahmed
Immer wenn ich diese Art von Fehler (zum arbeiten auf dem lokalen, aber nicht auf dem server) ich Feuer IIS-admin-tool (oder was auch immer Sie verwenden) und überprüfen, dass alles ist GENAU das gleiche. Wenn nicht machen Sie das gleiche dann ändern 1 kleine Sache zu einer Zeit.
Je nach Ihrer Rolle/organisation, die Sie möglicherweise nicht über Zugriff auf die server in dieser Weise, aber oft sind diese Fehler kommen auf die seltsamsten random checkbox auf eine Registerkarte, die Sie niemals sehen.
Es ist eine lange gedreht, kann aber nicht helfen, um zu versuchen.
Haben Sie andere web-Dienste, die auf der IIS6-Maschine? Es könnte möglich sein, dass das Problem damit zusammenhängen könnte, zu der unterschiedliche Versionen von IIS. Wenn möglich würde ich versuchen, es auf einem IIS7-server.
Wir sind bei der Planung Umzug der Website in der Zukunft, aber für den moment hat es zu bleiben, wo es ist. Ich bin mir nicht sicher von einer anderen web-Dienste auf dieser Maschine, aber ich bin Neigung in Richtung nicht.
InformationsquelleAutor Fermin
Haben Sie den benötigten registrierte httpHandler für die Möglichkeit, webservices gekennzeichnet als ein ScriptService?
Ja, entfernen Sie den /ws/, es sei denn, Ihr service befindet sich unter dem Pfad /ws/manageobjects.asmx
Ich entfernte den /ws/, aber leider hat das nicht helfen.
InformationsquelleAutor zincorp
Dies ist eine falsche Erklärung, die in javascript.
Korrekte Initialisierung des Objektes sein sollte:
Versuchen auch temporäre entfernen
async: false
aus$.ajax
's-Parametern.InformationsquelleAutor Alex Bagnolini
Muss sagen, ich bin nicht 100% verkauft, meine Antwort ist (alle) die Frage, ABER das würde der Deserialisierung.
Hinzufügen von einige Details, die für Ihr spezifisches Objekt.
auf der client-Seite:
auf der server-Seite müssten Sie:(genaue Bezeichnung des "objectSaveData") wie im client-code.
erstellen Sie ein ObjectData-Klasse cointaining eine Liste von objectItem ähnlich wie meine anderen Beispiel matching der Objekte (achten Sie auf den Namen).
HINWEIS: ich habe die ASP.NET ajax-extensions installiert - funktioniert mit asp.net 2.0-code für dieses Beispiel.
InformationsquelleAutor Mark Schultheiss
Okay, hier ist, wie es ist, für ein Objekt, gerade getestet:
============================================ASPX==================================
========================================================================
======================================================================
Und das funktioniert für ein einzelnes Objekt, als Nächstes werde ich versuchen eine Liste von Objekten:)
InformationsquelleAutor CloudDev
Sicherzustellen, dass Sie haben diese an der Spitze Ihrer Klasse
Überprüfen Sie auch alle Ihre parathesis, resharper ging ein bisschen verrückt auf mich und es dauerte eine Weile, bis der check durch.
Auch wenn Sie viele webmethods, versuchen Sie es zu einem basic hello world webservice, stellen Sie sicher, dass Ihre Arbeit in Erster Linie dann können Sie die Problembehandlung von dort.
Glück.
InformationsquelleAutor Netferret