Zwingen ASP.net webservice, JSON zurückgeben

Habe ich eine ASP.net web-service, ich bin für eine web-Anwendung, die liefert eine XML-oder JSON-Daten an mich, je nachdem, welche Funktion ich aufrufen. Dies hat gut funktioniert so weit, aber ich habe ein problem. Ich will erstellen Sie eine "export" - link auf meine Seite, wird eine JSON-Datei herunterladen. Der link formatiert ist sehr einfach:

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

Als Sie sich vorstellen können, dies sollte export von Artikel 2. So weit, So gut, ja?

Problem ist, dass ich da bin, die nicht speziell verlangt, dass die akzeptierte Inhaltstyp ist JSON, ASP.net absolut weigert sich, zurück zu senden, alles, aber XML ist einfach nicht angemessen für diese situation. 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 Angabe das ResponseFormat als JSON, bekomme ich immer zurück, XML, es sei denn, ich bitte Sie diese Methode über AJAX mit dem 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 nicht geben Sie mir einen download-dialog. Gibt es eine Möglichkeit zu zwingen ASP.net zu mir zurück JSON, unabhängig davon, wie die Daten abgerufen werden? Es scheint mir, dass nicht mit einer manuellen override für dieses Verhalten ist ein grober design versehen.


SCHNELLE ANTWORT:

First off, lassen Sie mich sagen, dass ich denke, dass womp ' s Antwort ist vermutlich der bessere Weg zu gehen langfristig (Konvertieren, WCF), aber deostroll führte mich auf die Antwort, die ich verwenden werden für die unmittelbare Zukunft. Es sollte auch darauf hingewiesen werden, dass dies scheint zu funktionieren, vor allem, weil ich wollte nur einen download, kann nicht so gut funktionieren in allen Situationen. In jedem Fall, hier ist der code, den ich am Ende mit, um das Ergebnis bekommen, das ich wollte:

    [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 return-Typ der void (was bedeutet, dass Ihre WSDL-werden neben nutzlos für diese Funktion). Die Rückkehr wird nichts versauen die Antwort, die wird von hand gebaut.

InformationsquelleAutor Toji | 2009-09-09

Schreibe einen Kommentar