Frage

Ich habe einen ASP.net Web-Service, die ich für eine Web-Anwendung bin mit der ein XML- oder JSON-Daten zu mir zurückkehrt, in Abhängigkeit von der Funktion, die ich nenne. Das hat gut funktioniert so weit, aber ich habe auf ein Problem stoßen. Ich will einen „Export“ Link auf meiner Seite erstellen, die eine JSON-Datei herunterladen werden. Die Verbindung ist so formatiert, sehr einfach:

<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>

Wie Sie sich vorstellen können, sollte dieser Artikel exportieren 2. So weit so gut, nicht wahr?

Das Problem ist, dass, da ich nicht speziell bin fordernd, dass der akzeptierte Inhaltstyp JSON ist, absolut ASP.net weigert sich alles andere als XML zurück zu senden, die gerade nicht geeignet für diese Situation ist. Der Code ist im Wesentlichen wie folgt:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Item ExportItem(int itemId)
    {
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download

        return GetExportItem(itemId);
    }

Trotz meiner das Response als JSON Angabe ich zurück XML immer, wenn ich diese Methode via AJAX-Request (Google Web Toolkit, BTW):

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
    builder.setHeader("Content-type","application/json; charset=utf-8");
    builder.setHeader("Accepts","application/json");
    builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});

Das ist toll, aber AJAX wird mir nicht einen Download-Dialog geben. Gibt es eine Möglichkeit ASP.net zu zwingen, mich JSON zurück zu geben, unabhängig davon, wie die Daten angefordert werden? Es scheint mir, dass keine Handbetätigung für dieses Verhalten aufweist, ist eine grobe Entwurf Aufsicht.


QUICK ANTWORT:

Zunächst einmal möchte ich sagen, dass ich glaube, dass Antwort womp ist wahrscheinlich der bessere Weg, langfristig (Rechnen zu WCF), aber deostroll führte mich auf die Antwort zu gehen, dass ich für die unmittelbare Zukunft verwenden werden. Außerdem sollte beachtet werden, dass dies scheint in erster Linie zu arbeiten, weil ich nur einen Download wollte, kann nicht so gut in allen Situationen arbeiten. In jedem Fall ist hier der Code, den ich am Ende mit dem Ergebnis erhalten wollte ich:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void ExportItem(int itemId)
    {
        Item item = GetExportItem(itemId);            

        JavaScriptSerializer js = new JavaScriptSerializer();
        string str = js.Serialize(item);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
        Context.Response.AddHeader("content-length", str.Length.ToString());
        Context.Response.Flush();
        Context.Response.Write(str);
    }

Bitte beachten Sie den Rückgabetyp von void (was bedeutet, dass Ihre WDSL für diese Funktion nutzlos nächste sein wird). etwas zurückkehrend wird die Antwort vermasselt, die von Hand gebaut wird.

War es hilfreich?

Lösung

Hier sind zwei Foren-Threads für Ihre Referenz:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982 aspx # 2338982

Ich habe keine klare Vorstellung. Sie sagen, auf die Konzentration des Inhaltstyp application / json auf Einstellung. Ich habe nicht vor mit wcf gearbeitet, aber ich glaube, Sie Verwendung des Response-Objekts machen.

Stellen Sie den Inhaltstyp auf dem Antwortobjekt. Führen Sie eine response.write Ihre json Daten als String übergeben und dann eine Response.End.

Andere Tipps

Asp.net Web-Services sind SOAP-basierte Web-Services. Sie werden immer XML zurück. Die Ajax-Bibliotheken kamen und die Script Sachen eingeführt wurden, aber nicht das zugrunde liegende Konzept ändern.

Es gibt ein paar Dinge, die Sie tun können.

WebMethods sind grenzwertig obsolet mit der Einführung von WCF. Sie könnten Ihre Web-Services WCF migrieren, in dem es haben viel mehr Kontrolle über das Ausgabeformat.

Wenn Sie das nicht tun wollen, können Sie manuell das Ergebnis Ihrer Webservice-Aufrufe in JSON serialisiert werden, und der Dienst wird wickeln, dass in einem SOAP-Header. Sie würden dann das SOAP-Material Streifen aus müssen.

Nur dachte ich, das da draußen werfen würde, da es nicht vorher erwähnt wurde ... wenn Sie WebServices verwenden, um mit ASP.NET 3.5, JSON ist das Standard-Return-Format. Es kommt auch zusammen mit JSON Serializer so können Sie die JavaScriptSerializer nicht mehr verwenden.

diesem Artikel auf Rick Strahl Blog spricht über die strongly- typisierte Umwandlung Sie zwischen Server-Seite Klassen und JSON-Objekten aus dem Client tun kann.

Ich habe vor kurzem ein Projekt mit diesen neuen JSON Sachen in .NET 3.5, und ich bin sehr beeindruckt von der Leistung. Vielleicht lohnt es sich einen Blick ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top