ASP.NET APIController 未在 json 中返回数据对象

ASP.NET APIController not returning data object in json

我目前正在使用 Angular 2 和 ASP.NET 开发一个小原型。

根据 angular.io 文档 (https://angular.io/docs/ts/latest/guide/server-communication.html):"We shouldn't expect json() to return the heroes array directly. The server we're calling always wraps JSON results in an object with a dataproperty. We have to unwrap it to get the heroes. This is conventional web api behavior, driven by security concerns."

看到这个 link : https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside

我在 ASP.NET 中构建了一个 APIController 来获取 JSON 中的英雄列表。这是我的代码:

[DataContract]
public class Hero
{
    [DataMember]
    public string id { get; set; }

    [DataMember]
    public string name { get; set; }

    public Hero(string id, string name)
    {
        this.id= id;
        this.name = name;
    }
}    

public class HeroesController : ApiController
{
    // GET api/<controller>
    public IEnumerable<Hero> Get()
    {
        return new Hero[] { new Hero("1", "TEST HERO #1"), 
                            new Hero("2", "TEST HERO #2")};
    }
}

但奇怪的是,我的 ApiController 返回给我这个 JSON 响应: [{"id":"1","name":"TEST HERO #1"}, {"id":"2","name":"TEST HERO #2"}]

而不是像这样的东西: {"data": [{"id":"1","name":"TEST HERO #1"}, {"id":"2","name":"TEST HERO #2"}]}

您知道为什么 ASP.NET Web api 不遵循此安全建议吗?或者我做错了什么?

非常感谢!

MVC return完全按照您编写的代码执行。相反,您可以 return 匿名 class 喜欢

return new { data = new Hero[] { new Hero(...), new Hero(...) } };

虽然我在谈论这个主题,但您可能希望养成使用 HttpResponseMessage 模式的习惯。你做事的方式没有明显的错误,但这允许对你正在响应的响应进行大量精细控制 returning,包括自定义错误消息和缓存过期等内容。

public HttpResponseMessage Get()
{
    try
    {
        var result = new { data = new Hero[] { new Hero(...), new Hero(...) } };
        return Request.CreateResponse(result);
    }
    catch (Exception ex)
    {
         return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "My custom error message");
    }
}