none
Webservice soll JSON liefern

    Frage

  • Hallo,

    würde gerne erreichen, dass mein WebService JSON-Daten liefert. Meine asmx-Datei sieht wie folgt aus:

        <WebMethod()> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
        Public Function OrderList() As String
            Return "[{...}]"       
        End Function

    Leider bekomme ich statt den JSON-Rohdaten das hier geliefert:

    <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">[{...}]</string>

    Nun habe ich gelesen dass WebMethoden grundsätzlich XML Webservices sind (stimmt das?) und ich möge doch lieber das hier verwenden:

    <WebGet(RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)> _
    Public Function OrderList() As String
    ...
    End Funktion

    Würde ich gerne machen, nur funktioniert das auch nicht. Damit gibt es einen "500 Internal Server Error",
    "Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/OrderList' endet"

    Da ich mich auf Neuland befinde, bin ich für jeden Tipp dankbar. Danke!

    Schönen Gruß
    W. Wolf


    Donnerstag, 15. August 2013 13:06

Antworten

  • Hallo,

    Nachtrag:

    Habe es nun irgedwie zum lauffen gebracht. Lösung war dass ich den Request nun als GET statt POST absetze.

    Bin aber alles andere als zufrieden, weil es in sich noch nicht stimmig ist.

    Folgendes funktioniert:

    <WebMethod()> _
    <ScriptMethod(UseHttpGet:=True, ResponseFormat:=ResponseFormat.Xml)> _
    Public Function OrderList() As String
            Return "[{""angnr"":""241083   "",""aenix"":0,""sachbanl"":""JL""}]"        
    End Function

    und liefert wie gewünscht:
    [{"angnr":"241083    ","aenix":0,"sachbanl":"JL"}]

    Wenn ich allerdings in meiner WebMethod "ResponseFormat:=ResponseFormat.Json" angebe, dann wird die Antwort maskiert, ich bekomme so was:
    {"d":"[{\"angnr\":\"241083    \",\"aenix\":0,\"sachbanl\":\"JL\"}]"}

    Wie kann ich diese "Formatierung" verhindern?

    Schönen Gruß
    W. Wolf

    Freitag, 16. August 2013 06:29

Alle Antworten

  • Hi,

    damit der Webservice JSON zurückliefert, muss man im das auch beim Aufruf sagen. Daher die Frage: Wie sieht der Code aus, mit dem Du die Webservicemethode aufrufst?

    Du solltest allerdings keinen String zurückliefern, sondern ein Objekt. Bei der Rückgabe wird das automatisch in JSON serialisiert, wenn der Aufrufer das angefordert hat.

    Schau evtl. auch mal hier:

      http://stackoverflow.com/questions/211348/how-to-let-an-asmx-file-output-json


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 15. August 2013 14:10
    Moderator
  • Hallo Stefan,

    Danke für die Antwort. Das mit der Anforderung habe ich inzwischen auch erkannt. Es kommt auf den Content-Type im Header an. "Normale" Abfragen bekomme ich inzwischen vom Server beantwortet. Normal ( unter Verwendung von Sencha Ext) im Sinne von:

                        var conn = Ext.create('Ext.data.Connection', { timeout: 5000 });
                        conn.request({
                            url: "test.asmx/OrderList",
                            method: "POST",
                            headers: { "Content-Type": "application/json; charset=utf-8" },                        
                            success: function (msg) {
                                console.log(msg.responseText);
                            },
                            error: function (e) {
                                console.log("Fehler");
                            }
                        });

    Das funktioniert also inzwischen. Was ich noch nicht hinbekomme, ist die gleiche Abfrage über einen Ext.Proxi. Nun ist mir klar, dass ihr hier keine Ext-Profis seid, aber ich versuche mal meinen Fehler zu beschreiben - vielleicht hat dieser nicht direkt mit Ext zu tun. Den Proxi konfiguriere ich analog zum o. Beispiel wie folgt:

            proxy: {
                type: "ajax",
                url: "test.asmx/OrderList",
                headers: { "Content-Type": "application/json; charset=utf-8" },
                actionMethods: { create: 'POST', read: 'POST', update: 'POST', destroy: 'POST' }
            }

    Das erzeugt einen Server-Fehler: "NetworkError: 500 Internal Server Error". Weiter steht da:
    {"Message":"Ungültiger JSON-Primitiv: page.","StackTrace":"   bei System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n usw.

    Wenn ich hingegen in der Proxi-Konfiguration die Zeile headers weglasse, funktioniert der Aufruf wieder, allerdings liefert meine Web-Methode wieder XML. Mit der Content-Type Angabe sehen für mich die beiden Headers identisch aus:

    Erste funktionierende Ajax-Abfrage:

    Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding gzip, deflate
    Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Content-Type application/json; charset=utf-8
    DNT 1
    Host localhost:59764
    Referer http://localhost:59764/ERP/ajax.aspx
    User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
    X-Requested-With XMLHttpRequest

    und zweite nicht funktionierende Proxi-Abfrage:

    Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding gzip, deflate
    Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Content-Length 23
    Content-Type application/json; charset=utf-8
    DNT 1
    Host localhost:59764
    Referer http://localhost:59764/ERP/erp.aspx
    User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
    X-Requested-With XMLHttpRequest

    Also hier stecke ich momentan fest. Würde mich über weitere Tipps freuen.

    Das mit "keinen String" zurückliefern verstehe ich allerdings auch nicht. Ich liefere einen String aus der Sicht von VB, aus Sicht von JavaScript ist das schon ein Objekt, also so was wie "{'eigenschaft': 'test'}". Oder was meintest Du mit Objekt?

    Schönen Gruß

    W. Wolf

    Freitag, 16. August 2013 05:57
  • Hallo,

    Nachtrag:

    Habe es nun irgedwie zum lauffen gebracht. Lösung war dass ich den Request nun als GET statt POST absetze.

    Bin aber alles andere als zufrieden, weil es in sich noch nicht stimmig ist.

    Folgendes funktioniert:

    <WebMethod()> _
    <ScriptMethod(UseHttpGet:=True, ResponseFormat:=ResponseFormat.Xml)> _
    Public Function OrderList() As String
            Return "[{""angnr"":""241083   "",""aenix"":0,""sachbanl"":""JL""}]"        
    End Function

    und liefert wie gewünscht:
    [{"angnr":"241083    ","aenix":0,"sachbanl":"JL"}]

    Wenn ich allerdings in meiner WebMethod "ResponseFormat:=ResponseFormat.Json" angebe, dann wird die Antwort maskiert, ich bekomme so was:
    {"d":"[{\"angnr\":\"241083    \",\"aenix\":0,\"sachbanl\":\"JL\"}]"}

    Wie kann ich diese "Formatierung" verhindern?

    Schönen Gruß
    W. Wolf

    Freitag, 16. August 2013 06:29
  • Hallo Wolfgang,

    Es freut uns, dass Du Dein Problem lösen konntest und danke, dass Du Deine Lösung hier im Forum gepostet hast. Jetzt können auch andere die das gleiche Problem haben unter Umständen davon profitieren.

    Gruss,

    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 22. August 2013 08:46
    Besitzer
  • Hallo Ionut,

    gelöst ist mein Problem zwar, im Sinne von: Ich kann zunächst weitermachen. Zufriedenstellend ist das allerdings nicht. Korrekt sieht anders aus. Ich fürchte, ich habe hier lediglich eine "Krüppellösung", anders kann ich das nicht bezeichnen. Es kann doch nicht sein, dass ich sauberes JSON nur dann bekomme, wenn ich meine Methode mit ResponseFormat:=ResponseFormat.Xml konfiguriere.

    Weiß nicht ob davon auch "andere profitieren" sollten. Auch ist mir vollkommen unklar, warum das GET funktioniert und als POST nicht. Ich glaube in diesem Thread sind mehr offene Fragen als befriedigende Antworten. Bitte nicht falsch verstehen: Der Vorwurf gilt mir selbst, weil ich keine bessere Lösung als die oben finden konnte. 

    Schönen Gruß
    W. Wolf


     

    Samstag, 24. August 2013 13:25
  • Hallo,

    habe zwar noch immer keine befriedigende Lösung für mein Problem gefunden, dafür aber einen Link wo das gleiche Problem bearbeitet wird:

    http://stackoverflow.com/questions/1238672/asp-net-json-web-service-response-format

    Stelle den mal hier rein, vielleicht suchen noch andere nach änlichen Problemen.

    Schönen Gruß

    W. Wolf

    Dienstag, 24. September 2013 07:12
  • Hallo,

    hier noch ein Link zum Thema. Damit kommt man der Sache allmählich näher:

    http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

    Schönen Gruß

    W. Wolf

    Donnerstag, 26. September 2013 09:59