C# WebMethod自动将类对象返回为JSON

C# WebMethod自动将类对象返回为JSON,c#,asp.net,json,C#,Asp.net,Json,有人能解释一下ASP.NET是如何在WebMethods中处理从类对象到JSON对象的转换的吗 例如,您有以下WebMethod,它返回一个Person对象: [WebMethod] public static Person GetPerson() { Person p = new Person() { Id = 1, Name = "Test" }; re

有人能解释一下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
类及其糟糕的性能还是

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

基本上,web和WebMethod之间有一些代码,这些代码接收请求,找出请求的内容,找到WebMethod并获得结果,然后根据请求头中可接受的格式将其序列化回客户端

它是否使用JavaScriptSerializer类

可能吧。我找不到任何能说明这一点的东西。但它不使用任何第三方库。因为这是一个内置的,这是一个很好的假设

您还可以看到许多使用JSON转换器进行转换的示例 将类对象转换为json对象。为什么会这样?是因为天气原因吗 它使用的JavaScriptSerializer类及其糟糕的性能或

WebMethod技术可能非常挑剔,有时会拒绝返回JSON,尽管有accept头。解决这个问题的一种方法是这样做:

[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
不再真正受支持。如果您需要一个基于JSON或XML的API,最好看看它,它使用Newtonsoft的JSON.NET来处理JSON序列化。我使用的是ASP.NET Webforms,其中有一些ajax调用,我可以在我的Webforms项目中使用Web API吗?是的!你当然可以。微软将这一倡议称为。基本上,所有服务都应该具有相同的功能(如果适用),您可以混合和匹配您的项目。实际上,我一开始是在Web表单中使用Web API的,不过现在我正在学习MVC。基本上只需添加一个NuGet包,配置一些路由,然后就可以将Web方法代码复制到Web API函数中。有关入门步骤,请参见我第一条评论中的链接。谢谢!我将对此进行研究,但我希望得到一个答案,以充分理解使用ajax调用的请求和响应之间的步骤。您说
WebMethod技术可能非常挑剔,有时会拒绝返回JSON
。这是否包括其他转换库,如JSON.NET?当我说拒绝返回JSON时,我的意思是它会忽略请求头并将其序列化为XML。这与您使用的JSON序列化程序无关,它完全与WebMethod实现在幕后的编码方式有关。因此,简而言之,创建没有返回类型的WebMethods并使用转换器将结果写回responsestream是最佳做法。或者使用ASP.NET Web API?使用ASP.NET Web API将是基于REST的API的最佳实践。约翰·桑德斯(JohnSaunders)对不使用Web方法而使用其他技术表示担忧。当时ASP.NET Web API还不太流行,但它很好地概述了不使用WebMethod/ScriptMethod/ASMX技术的一些原因。