【问题标题】:WebMethod returning class object as JSON automaticallyWebMethod 自动将类对象返回为 JSON
【发布时间】:2014-12-05 13:26:37
【问题描述】:

谁能解释一下 ASP.NET 如何在 WebMethods 中处理从类对象到 JSON 对象的转换?

例如,您有以下 WebMethod,它返回一个 Person 对象:

    [WebMethod]
    public static Person GetPerson()
    {
        Person p = new Person() 
        {
            Id = 1,
            Name = "Test"
        };

        return p;
    }

在我调用 WebMethod 的 jQuery 中,我得到一个包含 json 对象的响应。

ASP.NET 是如何自动做到这一点的?它是否使用JavaScriptSerializer 类?

您还看到了很多使用 JSON 转换器将您的类对象转换为 json 对象的示例。为什么是这样?是因为它使用的JavaScriptSerializer 类及其糟糕的性能还是...?

【问题讨论】:

  • 旁注:WebMethod 不再受支持。如果您需要基于 JSON 或 XML 的 API,最好查看 ASP.NET Web API,它使用 Newtonsoft 的 Json.NET 来处理 JSON 序列化。
  • 我正在使用 ASP.NET Webforms,我有一些 ajax 调用,我可以在我的 webforms 项目中使用 Web API 吗?
  • 是的!你当然可以。 Microsoft 有一个名为One ASP.NET 的倡议。基本上所有服务都应该具有相同的功能(如果适用),您可以混合和匹配您的项目。我实际上开始使用带有 Web 表单的 Web API,虽然现在我正在学习 MVC。它基本上就像添加一个 NuGet 包、配置一些路由一样简单,然后您实际上可以将您的 Web Method 代码复制到 Web API 函数中。有关入门步骤,请参阅我的第一条评论中的链接。
  • 谢谢!我会对此进行调查,但我希望也能得到答案,以充分理解使用 ajax 调用的请求和响应之间的步骤。

标签: c# asp.net json


【解决方案1】:

ASP.NET 是如何自动做到这一点的?

基本上,在 Web 和 WebMethod 之间存在一些代码,它们接受请求、确定请求的内容、找到您的 WebMethod 并获得结果,然后根据请求标头中可接受的格式将其序列化回客户端。

它是否使用 JavaScriptSerializer 类?

大概吧。我找不到任何说明它的东西。但它不使用任何第三方库。既然这是内置的,这是一个很好的假设。

您还看到很多使用 JSON 转换器进行转换的示例 你的类对象到一个 json 对象。为什么是这样?是不是因为 它使用的 JavaScriptSerializer 类及其糟糕的性能还是...?

WebMethod 技术可能非常挑剔,有时会拒绝返回 JSON,尽管接受标头。一种解决方法是执行以下操作:

[WebMethod]
public static void GetPerson()
{
    Person p = new Person() 
    {
        Id = 1,
        Name = "Test"
    };
    HttpContext.Current.Response.ResponseType = "application/json";
    HttpContext.Current.Response.Write(JsonConvert.SerializeObject(p));
    HttpContext.Current.Response.End();
}

您失去了内容协商(除非您通过检查请求标头手动实现它),但您可以更好地控制它的序列化方式。

【讨论】:

  • 你说WebMethod technique can be very finicky and sometimes will refuse to return JSON。这是否包括 JSON.NET 等其他转换库?
  • 当我说拒绝返回 JSON 时,我的意思是它忽略了请求标头并序列化为 XML。这与您使用的 JSON 序列化程序无关,它与 WebMethod 实现在幕后的编码方式有关。
  • 所以简而言之,创建没有返回类型的 WebMethods 并使用转换器将结果写回响应流将是最佳实践。还是使用 ASP.NET Web API?
  • 使用 ASP.NET Web API 将是基于 REST 的 API 的最佳实践。 John Saunders wrote 3 years ago 关于不使用 Web 方法来支持其他技术。 ASP.NET Web API 那时还没有出现,但它可以很好地概述不使用 WebMethod/ScriptMethod/ASMX 技术的一些原因。
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多