1

我在本地机器上托管了一个简单的 MVC Web api,它所做的只是Personnel以 JSON 格式返回对象。在同一台机器上,我有一个简单的 html 页面,它试图使用getJSON().

getJSON尽管响应成功返回,服务器和客户端是同一台机器,并且 JSON 有效,但调用失败并出现以下错误。

parsererror Error: jQuery110206749425150919706_1382127977754 was not called

在控制器...

// GET api/personnel
public List<Personnel> Get()
{
    return GetPersonnel();
}

GetPersonnel()只返回一个Personnel对象列表

public class Personnel
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public String RoomNumber { get; set; }
}

添加到 Application_Start() 以确保仅返回 JSON...

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

这是我用来调用这个 API 的 jQuery(在同一个盒子上)。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$.ajaxSetup({ async:false});
$(document).ready(function () {
    $("button").click(function () {
        var api = "http://localhost:13131/DirectoryServicePool/api/personnel?callback=?"; // this api doesn't work
        //api = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?"; // this api does
        $.getJSON(api, {
            format: "json"
        }, function (result) {
            alert("GotJSON");
        }).fail(function (XHR, status, error) {
            alert(status + ' ' + error);
        });
    });
});
</script>
</head>
<body><button>Get JSON data</button></body>
</html>

fiddler 中的响应(JSON 有效)...

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 Oct 2013 20:08:48 GMT
Content-Length: 244

[{"FirstName":"1","LastName":"5","RoomNumber":"6"},{"FirstName":"2","LastName":"5","RoomNumber":"6"},{"FirstName":"3","LastName":"5","RoomNumber":"6"},{"FirstName":"4","LastName":"5","RoomNumber":"6"}]

提前致谢。

4

1 回答 1

2

感谢您的评论,他们帮助我指出了正确的方向。我发布我的解决方案是为了节省其他健忘的人的时间。

如果您的客户端与服务器位于不同的站点域上,则必须使用 jsonp来使用 ajax 而不是 json 获取数据。他们是否在同一台机器上并不重要。

jQuery代码

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready(function () {
   $("button").click(function () {
    var api = "http://localhost:13131/DirectoryServicePool/api/personnel/";

    $.ajax({
        type: 'GET',
        url: api,
        success: function () {alert("it worked!");},
        dataType:'jsonp',
        contentType: "application/json"
        }); 
    });  
});
</script>
</head>
<body><button>Get JSON data</button></body>
</html>

服务器端的东西

JsonpMediaTypeFormatter通过 Tools > Library Package Manager > Package Manager Tools 在 VS 中安装

Install-Package WebApiContrib.Formatting.Jsonp

将以下内容添加到 Global.asax.cs 中的 Application_Start() 方法中

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));

不要忘记使用

using WebApiContrib.Formatting.Jsonp;
于 2013-10-19T00:09:00.453 回答