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
Du musst angemeldet sein, um einen Kommentar abzugeben.
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
Habe ich keine klare Vorstellung. Sie sagen, die Konzentration auf das setzen des content-type auf application/json. Ich habe nicht gearbeitet mit wcf vor, aber ich denke, man kann das Response-Objekt.
Die Art des Inhalts, auf das response-Objekt. Tun eine Antwort.schreiben Sie die Weitergabe Ihrer json-Daten als string und führen Sie dann eine Antwort.Ende.
um klar zu sein u wollen, dass es nach einem postback, richtig?
Ja, das ist eine viel einfachere Weise, es zu setzen, vielen Dank 🙂
(Oh, und in meinem vorherigen Kommentar sollte es gelesen haben "auf der server-Seite wie kann ich die Kraft JSON immer wieder werden"
haben u versucht zu manipulieren, das response-Objekt. Blick auf den code, der erwähnt wird in den folgenden url für ref example-code.com/vbdotnet/aspdotnet_zip_response.asp Sie können den Zugriff auf das response-Objekt über httpcontext.aktuelle.Antwort. Hoffe, das hilft.
InformationsquelleAutor deostroll
Asp.net web-services sind SOAP-basierte web services. Sie werden immer die XML zurückgeben. Die Ajax-Bibliotheken kam und die ScriptMethod Zeug wurde eingeführt, aber es ändert nichts an der zugrunde liegenden Konzept.
Gibt es ein paar Dinge, die Sie tun können.
WebMethods sind grenzwertig veraltet mit der Einführung der WCF. Sie überlegen,Migration von web services, WCF, in dem Sie ' ll haben viel mehr Kontrolle über das Ausgabeformat.
Wenn Sie nicht wollen, das zu tun, können Sie manuell serialisieren Sie das Ergebnis Ihrer webservice-Aufrufe in JSON, und der Dienst wird wickeln, dass in einem SOAP-header. Sie müssten dann Streifen aus dem SOAP-Zeug.
Wenn Sie nicht unterstützen, JSON und "immer die XML zurückgeben", was ist dann dieser Dekorator? [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
InformationsquelleAutor womp
Dachte, ich würde werfen dies draußen, da es nicht war bereits erwähnt... wenn Sie WebServices mit ASP.NET 3.5, JSON ist das Standard-format zurück. Es kommt auch zusammen mit JSON serializer, damit Sie aufhören können mithilfe der JavascriptSerializer.
Dieser Artikel auf Rick Strahl blog spricht über die stark typisierte Umwandlung, die Sie tun können, zwischen server-side-Klassen und JSON-Objekte aus der client.
Ich habe vor kurzem ein Projekt mit diesem neuen JSON-Zeug .NET 3.5, und ich bin äußerst beeindruckt von der Leistung. Vielleicht ist es einen Blick Wert...
InformationsquelleAutor Cᴏʀʏ