当前位置: 首页 > 面试题库 >

强制ASP.net Web服务返回JSON

高云瀚
2023-03-14
问题内容

我有一个用于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,但除非我通过AJAX(使用Google Web
Toolkit,BTW)请求此方法,否则我始终会获取XML:

    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对于该功能将几乎 无效 )。返回任何东西都会搞砸正在手工构建的响应。


问题答案:

以下是两个论坛主题供您参考:

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

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

我不清楚。他们说专注于将内容类型设置为application / json。我以前没有使用过wcf,但是我认为您可以使用Response对象。

在响应对象上设置内容类型。执行response.write将您的json数据作为字符串传递,然后执行response.end。



 类似资料:
  • 问题内容: 我在Angular中有一个服务,该服务使用我的API来获取用户信息并将其提供给控制器。设置如下: 在我的控制器中,我将其包含为: 这不会返回任何数据,而如果我将相同的服务功能放在控制器本身中,它将返回正确的值。我在这里想念什么?以前从未在Angular中使用过DI / Services,因此在某个地方可能是一个简单的错误。 我需要确保该服务在控制器加载 之前 返回数据。如何做到这一点

  • 我试图返回一个列表,并将该响应重定向到我的模型类。 例如:如果我使用,它工作得很好,但我不想为每个模型编写响应方法。 方法 错误 出现错误(Type=内部服务器错误,状态=500)。创建名为“index”的bean时出错:调用init方法失败;嵌套异常为java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.xxx.Applic

  • 我尝试通过methodhandles将方法链接在一起,其中一些方法来自泛型类型。如果函数返回泛型类型,我必须为MethodType指定Object.Class,但我看不到将其转换回泛型类型参数类型的简单方法。在大多数情况下,这没有问题,因为invoke似乎自动转换它们,但我必须创建mhs,它可以用InvokeExact运行。难道没有简单的方法使用MethodHandles进行强制转换吗? 我的测试

  • 问题内容: 我需要我的Web服务以返回JSON … 我的.asmx文件中包含以下代码: 返回以下内容: 如何强制它返回JSON而不是XML? 问题答案: 您的Web服务定义看起来正确。确保通过帖子调用服务,并记住该键将“内容类型”标头指定为。 (这是使用jQuery,但如果您愿意,可以使用低级JavaScript)

  • 基本上,我想做一个POST请求与以下主体: 为什么会这样?

  • 问题内容: 我试图创建一个服务来获取json并将其传递给我homeCtrl我可以获取数据,但是当将其传递给我的homeCtrl时,它总是返回undefined。我卡住了。 我的服务: 我的家庭控制器: 问题答案: 您应该从函数返回promise ,当它被解析后,它应该从该函数返回。 厂 同样在控制器内部,您应该调用factory函数,并在service函数解析该调用并将其分配给 码