我创建了一个带有代码隐藏文件的 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" };
    }
}
有帮助吗?

解决方案

即使ResponseFormat设置为JSON ,WebService也返回XML:

  

确保请求是POST请求,而不是GET。 Scott Guthrie有一个解释原因

     

虽然它是专门为jQuery编写的,但这对你也很有用:
  使用jQuery来使用ASP.NET JSON Web服务

其他提示

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

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

这可能已经是老新闻了,但神奇之处似乎在于:

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

这些部分就位后,GET 请求就会成功。

对于 HTTP POST

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

在客户端(假设您的 webmethod 名为 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);
            }
        });

我学到了很多困难(基本上花了4个小时在谷歌上),你可以在ASPX文件中使用PageMethods返回JSON(带有[ScriptMethod()]标记)用于静态方法,但是如果你决定将静态方法移动到asmx文件,它不能是静态方法。

此外,您需要告诉Web服务Content-Type:application / json以便从调用中恢复JSON(我正在使用jQuery和 3使用jQuery时要避免的错误文章非常具有启发性 - 来自在另一个答案中提到的同一个网站)。

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

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

“应用/ JSON;字符集= UTF-8'

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top