如何让 ASMX 文件输出 JSON

Posted

技术标签:

【中文标题】如何让 ASMX 文件输出 JSON【英文标题】:How to let an ASMX file output JSON 【发布时间】:2010-09-17 16:51:23 【问题描述】:

我创建了一个带有代码隐藏文件的 ASMX 文件。它工作正常,但它正在输出 XML。

但是,我需要它来输出 JSON。 ResponseFormat 配置似乎不起作用。我的代码隐藏是:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService 
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    
        return new string[]  "abc", "def" ;
    

【问题讨论】:

Asmx web service how to return JSON without an XML wrapper?的可能重复 【参考方案1】:

要接收纯 JSON 字符串,而不将其包装到 XML 中,您必须将 JSON 字符串直接写入 HttpResponse 并将 WebMethod 返回类型更改为 void

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService 
        [WebMethod]
        public void WebMethodName()
        
            HttpContext.Current.Response.Write("property: value");
        
    

【讨论】:

当您想在没有额外的 XML 包装器的情况下返回 XML 时也可以使用。 不,您真的不必这样做,正如其他答案所证明的那样。我有很多遗留服务返回 JSON 或 XML,具体取决于 Web 客户端的要求,而且我从来不必求助于直接写入响应流。【参考方案2】:

来自WebService returns XML even when ResponseFormat set to JSON:

确保请求是 POST 请求,而不是 GET。 Scott Guthrie 有一个post explaining why。

虽然它是专门为 jQuery 编写的,但这也可能对你有用:Using jQuery to Consume ASP.NET JSON Web Services

【讨论】:

或者您也可以添加以下注释 [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 公共字符串 TestData() 以在您的 Web 服务中启用 GET 哇。谁会猜到您无法通过GET 请求获得JSON 响应。逆天。谢谢你 - 我把头发扯掉了! 我不同意 POST 请求在这里是合适的。端点不期望数据,并且 OP 不向服务器发送任何数据(与 Scott G 的帖子不同),当然也不打算更改服务器上的数据。事实上,OP 具有允许 GET 请求的正确 ScriptMethod 属性 - UseHttpGet=true。他们只是调用一个端点来“获取”一些数据。 GET 请求很好 - 所缺少的只是在请求中设置 Content-Type,请参阅下面的答案。 有点离题但相关。上面的 Encosia URL 会在 Chrome 上触发一个可怕的安全警告,指出该站点包含恶意软件。 这充其量只是故事的一部分。【参考方案3】:

现在这可能已经是老新闻了,但神奇的是:

Web 服务类的[ScriptService] 属性 [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 方法 内容类型:请求中的应用程序/json

有了这些部分,GET 请求就成功了。

对于 HTTP POST

[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 方法

在客户端(假设您的网络方法称为 MethodName,它采用一个名为 searchString 的参数):

        $.ajax(
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify( searchString: q ),
            success: function (response)                   
            ,
            error: function (jqXHR, textStatus, errorThrown) 
                alert(textStatus + ": " + jqXHR.responseText);
            
        );

【讨论】:

有趣的是 application/json 是必需的,当不存在时,它将根据我使用 Fiddler 的经验返回 XML。返回两种数据类型的方式有点奇怪? 为什么需要将Content-type 设置为application/json[ScriptMethod(ResponseFormat=ResponseFormat.Json)] 不应该自动执行此操作吗?逆天。感谢您的研究。 [ScriptMethod... 在我的情况下似乎无法编译。找不到UseHttpGet 的定义,如果我尝试导入ScriptMethodAttribute 或说ScriptMethodAttribute.UseHttpGet,那么它说需要一个常量表达式。 我想我现在明白了。我在 VB.NET 中使用 <ScriptMethod(UseHttpGet = True...,而不是 <ScriptMethod(UseHttpGet:=True... [ScriptService] 在类级别,那些在函数级别:[WebMethod(EnableSession = true)][ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]HttpContext.Current.Response.ContentType = "application/json"; 作为函数体的第一行仍然会导致 xml 输出。【参考方案4】:

我通过艰难的方式学到了一个快速的陷阱(基本上在 Google 上花了 4 个小时),您可以在 ASPX 文件中使用 PageMethods 来为静态方法返回 JSON(带有 [ScriptMethod()] 标记),但是如果您决定将静态方法移动到 asmx 文件,它不能是静态方法。

此外,您需要告诉 Web 服务 Content-Type: application/json 以便从调用中获取 JSON(我使用的是 jQuery,3 Mistakes To Avoid When Using jQuery 文章非常有启发性 - 它来自提到的同一个网站在这里的另一个答案中)。

【讨论】:

【参考方案5】:

您是从客户端脚本还是在服务器端调用 Web 服务?

您可能会发现向服务器发送内容类型标头会有所帮助,例如

'应用程序/json;字符集=utf-8'

在客户端,我使用原型客户端库,并且在进行 Ajax 调用时有一个 contentType 参数,您可以在其中指定它。我认为 jQuery 有一个 getJSON 方法。

【讨论】:

这是我心目中的正确答案。虽然使用发布请求是一个很好的建议,但代码没有任何问题,因为它是在 OP 中编写的。可能的罪魁祸首是内容类型标头错误。例如,JQuery 会自己发送“application/json”,但包含一些额外的“text/xml”值,这些值会导致 asp.net 仍然返回 xml。【参考方案6】:

替代方案:使用通用 HTTP 处理程序 (.ashx) 并使用您喜欢的 json 库手动序列化和反序列化 JSON。

我发现完全控制请求的处理和生成响应优于 .NET 为简单的 RESTful Web 服务提供的任何其他功能。

【讨论】:

以上是关于如何让 ASMX 文件输出 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何从 2.0 asmx Web 服务返回 JSON

如何让golang 把变量解析为json,并输出为文件。

使用 Response.Write JSON 输出从 Jquery 调用 c# asmx Web 服务

如何在 ubuntu/linux 上运行 asmx webservice?

从旧的 asmx webservice 发送和接收 json 对象

如何创建和发布.asmx Web Service