2009-07-13 4 views
12

Ich sah eine ähnliche Frage, aber es behob mein Problem nicht. Ich habe einen JSON-Webdienst in einer ASMX-Datei;ASP.NET JSON-Web-Service gibt immer die JSON-Antwort zurück, die in XML verpackt ist

Der Code für die Web-Methode

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public string GetUserRoles(string JSONUserCode) 
     { 
      string retRoles = string.Empty; 
      List<JSONRole> roles = new List<JSONRole>(); 

      {... I Populate the roles here ...} 

      DataContractJsonSerializer serializer = new 
      DataContractJsonSerializer(roles.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      serializer.WriteObject(ms, roles); 
      string jsonString = Encoding.Default.GetString(ms.ToArray()); 
      ms.Close(); 
      return jsonString; 
     } 

Dies korrekt formatiert die Liste korrekt aber wickelt die gesamte Rückkehr in XML. Hier ist die Antwort:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/"> 
     [{"Name":"Accounts Payable"},{"Name":"Payroll"}] 
    </string> 

Sie die Antwort, um sich selbst sehen können über diesen Link klicken:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

Ich brauche die Antwort nur sein:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}] 

Irgendwelche Ideen ? Danke für Ihre Hilfe.

Antwort

11

Die WebMethod kann die gleichen Informationen sowohl als XML und JSON dienen. Sie müssen das gewünschte Format (dataType) im Client angeben, wenn Sie Ihre Anfrage senden.

Auch sind Sie eigentlich nicht das Objekt JSON manuell serialisiert werden, sondern kehren Rollen, und es wird zu JSON serialisiert werden, wenn Ihr Kunde die Daten als JSON anfordert.

EDIT

jQuery Beispiel (beachten Sie den Datentyp-Parameter):

$.ajax({ 
    type: 'GET', 
    url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    data: '{"JSONUserCode":"1234"}', 
    success: myCallback 
}); 

Es ist erwähnenswert, dass das Objekt nicht in genau dem Format zurückgegeben werden Sie festgelegt, sondern verpackt in ein Objekt:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] } 

Dies ist aber eigentlich recht wünschenswert, for added security

+0

Gibt es trotzdem, den Datentyp in einem POST angeben? – JohnnyCantCode

+0

Ich bin mir nicht sicher, ob ich folge ... das obige Beispiel ist ein POST. –

+0

Es tut mir leid, ich meine den Parameter in der URL übergeben wie die URL, die ich in meine Frage aufgenommen habe. – JohnnyCantCode

1

Stellen Sie sicher, dass Ihre Serviceklasse über das Attribut [ScriptService] verfügt. Dieses Attribut wird nicht standardmäßig hinzugefügt.

1

Probieren Sie Jayrock für .NET, es ist eine nette Handler für .NET JSON RPC. Es wird genau das tun, was Sie brauchen. Es gibt eine Schritt-für-Schritt-Anleitung für ASP .NET JSON RPC here.

0

Wir haben eine andere Seite erstellt, die die Seite des Service-Servers aufruft und die Antwort schreibt (in unserem Fall eine .aspx). Wir bereinigten den gesamten HTML-Code, den Kopfbereich des Doctype und machten den serverseitigen Code, um den Dienst und die Antwort aufzurufen.

(in aspx Fall lassen Sie die Seite Richtlinie am oberen Rand)

auf diese Weise eine saubere Zeichenfolge zu erhalten.

Wenn dies unsere Anwendung Sicherheitsrisiken oder größeren Leistungseinbußen aussetzt, würde ich die Kommentare sehr begrüßen. Einfach zu beschäftigt, um es hier zu fragen oder zu suchen :)

1

Ich machte den gleichen Fehler, indem ich die Serialisierung selbst handhabte. Sie sollten String nicht zurückgeben, sondern das Objekt selbst.

Wenn Sie bereits hundert Dienste wie diese entwickelt haben, arbeiten Sie für Sie: gerade erstellt ein aspx, ServiceCaller.aspx, entfernen Sie alles in der HTML verlassen Sie einfach die Anweisung Seite und verwenden Sie den CodeBehind, um den Dienst und die Antwort .Schreibe die Zeichenfolge. Nimm auch den Namen der Service-Methode als Parameter wie "HelloWorld" und verwende Reflection, um ihn aufzurufen.

Es ist irgendwie zeigen Sie Ihr linkes Ohr mit der rechten Hand, aber es funktioniert. Sie können auch einfach eine Rollenverwaltung integrieren und die Reflektion verwenden, um den Dienstnamen als Zeichenfolge zu erhalten, überprüfen Sie die Datenbank, wenn der Benutzer diesen Dienst aufrufen kann und mit Reflection. Rufen Sie die Methode auf.

(keine Kommentare zu diesem Thema ist willkommen :)

0

Ihre verpassten nur „statisch“ Schlüsselwort in Methodendeklaration schauen Sie bitte in die folgenden es funktionieren sollte.

Zur Info: Alle Web-Methoden sollten

[WebMethod] [Script (Responseformat = ResponseFormat.Json)]

public static string GetUserRoles(string JSONUserCode) 
    { 
     string retRoles = string.Empty; 
     List<JSONRole> roles = new List<JSONRole>(); 

     {... I Populate the roles here ...} 

     DataContractJsonSerializer serializer = new 
     DataContractJsonSerializer(roles.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, roles); 
     string jsonString = Encoding.Default.GetString(ms.ToArray()); 
     ms.Close(); 
     return jsonString; 
    } 
3

Es stellte sich heraus statisch ist es nicht Datentyp, sondern zählt

contentType: 'application/json; charset=utf-8'. 

Es funktionierte wie ein Charme.

0

Statt einen String in Ihrer WebMethod Verwendung Rückkehr:

JavaScriptSerializer js = new JavaScriptSerializer(); 
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));