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

时间:2016-03-02 16:33:22

标签: asp.net angularjs asp.net-apicontroller

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

根据angular.io文档(https://angular.io/docs/ts/latest/guide/server-communication.html):“我们不应期望json()直接返回英雄数组。我们调用的服务器总是将JSON结果包装在具有数据表格的对象中。我们必须解开它以获得英雄。这是传统的web api行为,受到安全问题的驱使。“

请参阅此链接:https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside

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

[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”}} < / p>

您是否有任何想法为什么ASP.NET Web API不遵循此安全建议?或者也许我做错了什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

MVC正在返回您编写的内容。相反,你可以返回一个像

这样的匿名类
return new { data = new Hero[] { new Hero(...), new Hero(...) } };

当我谈论这个话题时,你可能想养成使用HttpResponseMessage模式的习惯。你做事的方式并没有明显的错误,但是这允许对你返回的响应进行大量的细粒度控制,包括自定义错误消息和缓存过期等。

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");
    }
}