从MVC 4 Asp.net中的Rest服务获取请求获取空响应

时间:2013-07-21 18:59:59

标签: jquery asp.net-mvc json rest httprequest

我有一个简单的方法,创建一个对象列表Team,将其转换为Json然后返回它。

public ActionResult Index()
{
    var teams = new List<Team>() {
       new Team{ Name = "Caracas F.C", City = "Caracas", Id = 1},
       new Team{ Name = "Millonarios", City = "Bogota", Id = 2},
       new Team{ Name = "Independiente", City = "Bogota", Id = 3}};

    var jsonData = new { teamsData = teams };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

当我转到该网址(http://prototypeteam.apphb.com/时,请自行查看),我可以清楚地看到Json

  

{“teamsData”:[{“Id”:1,“Name”:“Caracas FC”,“City”:“Caracas”},{“Id”:2,“Name”:“Millonarios”,“市 “:” 波哥大 “},{” ID “:3,” 名称 “:” 独立队”, “城市”: “波哥大”}]}

但是当我尝试使用JQuery获取Json时,它返回时没有响应:

self.allTeams = ko.observableArray();
    $.getJSON("http://prototypeteam.apphb.com/", function (data) {
        var mappedTeams = $.map(data.teamsData, function (item) {
            return new TeamViewModel(item);
        });
        self.allTeams(mappedTeams);
});

TeamViewModel = function (data) {
    self = this;
    self.Id = data.Id;
    self.Name = data.Name;
    self.City = data.City;
}

这就是我使用Mozilla的Firebug所获得的。

enter image description here

如果有人能帮助我理解为什么会这样。我不明白为什么我清楚地看到Json的URL,但JQuery似乎不明白发生了什么。谢谢。

1 个答案:

答案 0 :(得分:1)

您所看到的是相同的原始政策。

Javascript有一个安全措施,你不能从外部URL获取内容,你只能从同一个域获取带有ajax的文件。

有两个例外:

  1. JSONP。由于jsonp不是真正的ajax,而是像任何其他脚本标记一样将脚本标记插入到DOM中,因此它避免了相同的原始策略。该服务必须支持这一点并将json字符串包装在一个脚本加载后执行的函数中。

  2. CORS。启用CORS标头允许您使用其他域中的脚本,但必须再次在服务器端设置这些脚本。

  3. 还可以选择使用Yahoo YQL或Pipes等服务,但这只是获取内容并将其包装在JSONP中或添加CORS标头,因此它使用上述两个选项之一。

    同样的原始策略适用于任何地方,即使您在localhost上运行所有内容并尝试从Web获取文件,相同的源策略也不允许它,因为URL不匹配。