2009-04-03 3 views
3

Ich versuche, einen ASP.net-Webdienst zu schreiben, der von einem jQuery AJAX-Aufruf verwandt wird. Ich bin absolut am Ende meines Verstandes versucht, dies zur Arbeit zu bringen. Ich habe eine Reihe ähnlicher Fragen online gesehen, aber ich konnte keine passende Lösung finden.Probleme mit ASP.net JSON Webservice-Antworttyp

Wenn ich versuche, den Ajax-Aufruf (über jquery) zu bekommen, bekomme ich eine erfolgreiche Antwort vom Server, aber die Anfrage scheitert wegen eines Parser-Fehlers.

Ich habe den vom Webservice zurückgegebenen JSON validiert und er ist gültig. Das Problem scheint von der Tatsache herrühren, dass asp.net das JSON-Objekt als XML zurückgibt.

ich den Rückgabetyp als json

<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _ 

mit angegeben habe ich die folgende http-Handler hinzugefügt haben, da es als ein potenzielles fix

<httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory" validate="false"/> 
</httpHandlers> 

Der Inhaltstyp wird erwähnt wurde eingestellt "application/json; charset = utf-8" und der dataType zu "json" in meinem jquery ajax setup. Der Anfragetyp scheint korrekt zu sein, aber die Antwort ist immer xml.

Ich kann die Anfrage erfolgreich machen, indem Sie den dataType entfernen, aber ich würde sehr gerne vermeiden, ein eval zu verwenden, um die Daten zu deserialisieren.

Wenn jemand einen Vorschlag hat, werde ich sehr geschätzt. Ich habe mir für ein paar Tage die Haare ausgezogen.


JAVASCRIPT

(function($) { 
$.ajaxSetup({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    global: false, 
    dataType: "json" 


}); 

function auto() { console.log("test"); return; }; 

$.fn.species = { 
    test: function() { alert("test"); }, 
    load: function() { //load and attach species list to element as dropdown 
     $.ajax({ 
      url: "SpeciesService.asmx/List", 
      success: function(msg) { console.log(msg); }, 
      error: function (xhr, desc, exceptionobj) { 
         console.log(xhr.responseText); 
         console.log(desc); 
         console.log(exceptionobj); 

      } 
     }); 
       return this; 

    } 

}; //Species Block 

}) (jQuery); // jQuery Alias-Block

ASP.NET Webservice

<%@ WebService Language="VB" Class="SpeciesService" %> 

Imports System.Web Importe System.Web.Services Importe System.Web.Services.Protocols Importe Arten Importe System.Runtime.Serialization

'Um den Aufruf dieses Web-Service aus dem Skript mithilfe von ASP.NET AJAX zu ermöglichen, entfernen Sie die Kommentarzeichen für die folgende Zeile. '_

_ _ Public Class SpeciesService

Inherits System.Web.Services.WebService 
<WebMethod()> _ 
<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _ 
Public Function Data(ByVal id As Integer) As String 
    Dim curSpecies As New Species(id) 
    Return curSpecies.serialize 
End Function 

<WebMethod()> _ 
<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _ 
Public Function List() As String 

    Return Species.list() 
End Function 

End Class

Antwort

2

Versuchen Sie, ein Dummy-json Daten mit JQuery wie dieses Posting:

$.ajaxSetup({ 
    type: "POST", 
    data : "{'foo':'bar'}" 
... 
+0

Ich glaube, dieses Problem ist in jQuery 1.4.x behoben. In jQuery 1.3.x benötigen Sie nur Daten: '{}'. * Alle * Daten zwingen jQuery, den Inhaltstyp festzulegen; legitime Schlüssel und Werte sind nicht notwendig. –

1

Das ist mehr als Andeutung einer Antwort - ich habe Pagemethods anstatt einen Web Service wurde mit und es funktioniert sehr gut. Ich würde versuchen, wenn es mit dem gleichen Problem leidet.

1

Wenn Sie die Header sehen gibt es einen Content-Length gesendet? IIS erfordert eine Inhaltslänge für einen Post, sodass das Hinzufügen eines leeren Bodys zum Post es möglicherweise auch behebt.

Und ich denke, der Grund, warum es mit dem auf json gesetzten Datentyp funktioniert, ist, dass jquery in diesem Fall einen leeren Post-Body für Sie hinzufügt.

0

In Ordnung - Vielen Dank für Ihre Hilfe. Der Mangel an Dummy-Daten war der Kern des Problems. Als ich versuchte, es hinzuzufügen, bevor es einen Serverfehler verursachte, und ich ging zu etwas anderem weiter.

Ich kann nicht einmal herausfinden, was den Server Fehler Teil des Problems behoben. Ich verbrachte zehn Minuten damit, mich geistesabwesend mit der Syntax auseinander zu setzen (Gedankenstriche, Caps, Kommentare), weil ich zu frustriert war, um mich auf das vorliegende Problem zu konzentrieren. Ich habe die Seite aktualisiert und plötzlich funktioniert es gut. Die Antwort war also, Dummy-Daten zu posten und zufällige Mystery-Syntaxfehler zu korrigieren.

Wie auch immer, ich kann Ihnen nicht genug dafür danken, dass Sie mich wieder auf die richtige Spur gebracht haben.