我目前正在使用Angular 2和ASP.NET开发一个小原型。
根据angular.io文档(https://angular.io/docs/ts/latest/guide/server-communication.html):“我们不应期望json()直接返回英雄数组。我们调用的服务器总是将JSON结果包装在具有数据表格的对象中。我们必须解开它以获得英雄。这是传统的web api行为,受到安全问题的驱使。“
我在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不遵循此安全建议?或者也许我做错了什么?
非常感谢!
答案 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");
}
}