【问题标题】:ASP.NET APIController not returning data object in jsonASP.NET APIController 未在 json 中返回数据对象
【发布时间】:2016-03-02 16:33:21
【问题描述】:

我目前正在使用 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 格式的英雄列表。这是我的代码:

[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 不遵循此安全建议吗?还是我做错了什么?

非常感谢!

【问题讨论】:

  • WebAPI 让您可以控制整个响应消息,让您可以控制是否实施该模式。这完全取决于您。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2015-02-15
    • 2020-11-25
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多