2009-05-22 3 views
8

Ich kann meinen Webservice mit jQuery WENN der contentType = "application/x-www-form-urlencoded; charset = utf-8 "ASMX Webservice gibt JSON nicht zurück, kann nur POST mit der Anwendung/x-www-form-urlencoded contentType

Dies wird jedoch, senden Sie das xml: <string>[myjson]</string>

Wenn ich versuche, den Dienst POST mit "application/json; charset = utf-8" ich erhalte einen 500-Fehler mit leeren Stacktrace und Exception . Meine Webservice-Funktion wird nie getroffen, daher weiß ich nicht genau, wie ich diese Situation debuggen soll.

Meine Methoden und Klassen sind mit den entsprechenden Attributen versehen und sind so eingestellt, dass sie JSON als Antworttyp verwenden (wie auch meine WSDL- und DISCO-Dateien). Ich habe die Ajax-Erweiterungen installiert und die erforderlichen Einträge in web.config.

Dies ist auf einer SharePoint-Farm, aber ich bin mir nicht sicher, dass das zu viel Unterschied macht. Ich habe die web.config-Änderungen auf allen WFEs installiert sowie die Ajax-Erweiterungen installiert. Auch hier funktioniert der Dienst, er akzeptiert nur den Standard-Inhaltstyp.

nicht sicher, was ich bin fehlt hier, fellas ...

meine Ajax-Aufruf:

$.ajax({ 
type: "POST", 
url: "/_vti_bin/calendar.asmx/Test", 
dataType: "json", 
data: "{}", 
contentType: "application/json; charset=UTF-8", 
success: function(msg){ 
    alert(msg); 
    }, 
error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); } 
}); 

Meine WebService-Klasse:

[WebService(Namespace = "http://namespace")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService()] 
public class CalendarService : WebService 
{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string Test() 
    { 
     return "Hello World"; 
    } 
} 
+0

Das gleiche passiert bei ASP.NET MVC 1.0 beim Ausführen einer AJAX-Anfrage. –

Antwort

0

nicht sicher, ob es könnte sein, diese Einfach, aber ich benutze jQuery, um JSON von meinen Webmethoden zurückzurufen.

der Hauptunterschied ich sehe, ist das Attribut der Klasse

[System.Web.Script.Services.ScriptService]

[WebService(Namespace = "http://MyNameSpace")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.Web.Script.Services.ScriptService] 
    public class Web : System.Web.Services.WebService{ 

     [WebMethod] 
     public string TestMethod(){ 
     return "Testing"; 
     } 

    } 

Ich muss annehmen, dass Sie werden mit dem 3.5 Framework, da dies die einzige Möglichkeit ist, JSON-Webmethoden verfügbar zu machen.

Meine Anrufe von jQuery aussehen praktisch identisch, also kein Problem dort.

+0

versuchte dies und bekomme immer noch den XML-Wrapper ... –

-1

Sieht so aus, als müssten Sie json als Antwortformat im scriptMethod-Tag angeben. Dies ist von vb.net, aber ich bin sicher, dass Sie auf die Idee:

Responseformat: = ResponseFormat.Json

+0

Wie Sie im eingefügten Code sehen können, liefere ich das Antwortformat an das ScriptMethod-Attribut. –

0

Wenn Sie dies in IE zu testen sind, versuchen die charset Deklaration von Ihrem content Attribute zu entfernen (dh es sollte wie folgt aussehen:

contentType: "application/json", 

ich habe noch, warum zu entdecken, aber IE scheint seine Knickerbocker in einer Torsion zu erhalten, wenn JSON macht mit dem „charset=UTF-8“ Teil nennt.

alt text

0

Ich glaube, Sie suchen die WebInvoke oder WebGet Attribut, es lässt Sie Uri Vorlage, Body-Style, Anfrage und responseformats angeben, zum Beispiel:

[WebGet(ResponseFormat= WebMessageFormat.Json)] 

This Verbindung helfen können . Es gibt einen ähnlichen Artikel für WebInvoke (hauptsächlich für Postsendungen).

+1

Die Frage war über ASMX Web-Service; WebGet gilt für WCF-Verträge. –

0

Ich benutze JQuery AJAX JSON Aufrufe an ASMX Webservice ziemlich viel. Es funktioniert perfekt in allen Browsern. Ich verwende .NET 2.0 mit den installierten ASP.NET AJAX Extensions (gebündelt in 3.5).

Meine Klasse hat die gleichen Dekorateure wie Sie. Meine Methoden haben nur den [WebMethod(EnableSession = true)] Dekorateur. Meine web.config hat jedoch den folgenden Eintrag in seinem Httphandlers Abschnitt:

<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 

Mein jquery Aufruf sieht wie folgt aus:

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "path/to/service/jsonservice.asmx/MethodName", 
    data: JSON.stringify(DTO), 
    dataType: "json", 
    success: function(rtrn) { alert("good"); }, 
    error: function(req, msg, err) { alert("bad"); } 
}); 

This article die Wurzel meines Wissens.

3

Ich habe dies funktioniert in 2.0 mit Web-Services, aber ich habe Schutz vor der. D (siehe dataFilter unten). Ich gebe auch eine Reihe von Objekten zurück. HINWEIS: Die Klasse für das Objekt ist statisch oder würde zumindest für mich nicht korrekt funktionieren.

$.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: "{}", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
       typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "webservice/ModifierCodesService.asmx/GetModifierList", 
     success: function(msg) 
     { 
      LoadModifiers(msg); 
     }, 
     failure: function(msg) 
     { 
      $("#Result").text("Modifiers did not load"); 
     } 
    }); 

ist hier ein snippett meiner Web-Service:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[ScriptService] 
public class ModifierCodesService : System.Web.Services.WebService 
{ 

    /// <summary> 
    /// Get a list of Modifiers 
    /// </summary> 
    /// <returns></returns> 
    [WebMethod(EnableSession = true)] 
    public Modifier[] GetModifierList() 
    { 
     return GetModifiers(); 
    } 
     /// <summary> 
     /// Modifiers list from database 
     /// </summary> 
     /// <returns></returns> 
     private Modifier[] GetModifiers() 
     { 
      List<Modifier> modifier = new List<Modifier>(); 
      ModifierCollection matchingModifiers = ModifierList.GetModifierList(); 
      foreach (Modifier ModifierRow in matchingModifiers) 
      { 
       modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description)); 
      } 
      return modifier.ToArray(); 
     } 
    } 

...

der Objektcode:

public static class ModifierList 
    { 

     /// <summary> 
     /// Returns the Modifier Collection. 
     /// </summary> 
     /// <param name="prefix"></param> 
     /// <returns></returns> 
     public static ModifierCollection GetModifierList() 
     { 
+1

SO unterm Strich ändern öffentlichen String Test() { zu öffentlichen statischen String Test() { und sehen, ob das für Sie funktioniert. –

1

Ich habe damit kämpfte ich heute mit Eine iPhone App, die mit einem .Net Web Service kommuniziert.

Ich fand, dass, wenn ich meinen Inhaltstyp zu Anwendung/jsonrequest änderte, es ohne ein Problem lief und ich in der Lage war, die Daten in meinem Web-Server zu verarbeiten.

Nur für grins habe ich die oben erwähnte Zeile zu meiner web.config hinzugefügt, aber es hat keine Anwendung/Json arbeiten.

Verwandte Themen