【发布时间】:2009-09-09 19:20:05
【问题描述】:
我有一个用于 Web 应用程序的 ASP.net Web 服务,它根据我调用的函数向我返回 XML 或 JSON 数据。到目前为止,这一直运作良好,但我遇到了问题。我想在我的页面上创建一个“导出”链接,用于下载 JSON 文件。该链接的格式非常简单:
<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>
正如您想象的那样,这应该导出项目 2。到目前为止一切顺利,是吗?
问题是,由于我没有明确要求接受的内容类型是 JSON,ASP.net 绝对拒绝返回除 XML 之外的任何内容,这不适合这种情况。代码实质如下:
[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);
}
尽管我将 ResponseFormat 指定为 JSON,但我总是返回 XML,除非我通过 AJAX 请求此方法(使用 Google Web Toolkit,顺便说一句):
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(){...});
很好,但 AJAX 不会给我一个下载对话框。有什么方法可以强制 ASP.net 将 JSON 返回给我,而不管数据是如何请求的?在我看来,没有手动覆盖这种行为是一个严重的设计疏忽。
快速回答:
首先,让我说我认为 womp 的答案可能是长期发展的更好方法(转换为 WCF),但 deostroll 让我得到了我将在不久的将来使用的答案。另外,应该注意的是,这似乎主要是因为我只想下载,可能在所有情况下都无法正常工作。无论如何,这是我最终用来获得我想要的结果的代码:
[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);
}
请注意 void 的返回类型(这意味着您的 WDSL 将对该功能几乎无用)。返回任何东西都会破坏手工构建的响应。
【问题讨论】:
标签: web-services json asmx