我有一个webapi服务,我需要从网络应用程序访问
如果我直接调用webapi url(例如/ api / scrccc / 32),它会在不到5秒的时间内返回数据,但是当从jquery调用时,它需要超过5分钟(!!!)分钟
我的ajax电话是
j$.ajax({
type: "GET",
url: '/api/scrccc/' + id + '?dt=' + new Date().getTime(),
error: function (jqXHR, status, error) {
//....
},
success: function (data, status, jqXHR) {
//....
}
});
这种情况发生在javascript控制台(firebug)打开或关闭,以及Chrome和FF
中任何人都知道为什么会这样?
修改
以下是Chrome中使用Jquery调用的时间:
以及Chrome中可以直接访问地址栏中的网址的时间
...还有带时间戳的浏览器中的timimgs
编辑 - 6月1日
我意识到从ajax和浏览器的地址栏调用webapi之间存在差异: - ajax调用请求响应为json - 浏览器请求响应为XML
所以我在Postman中测试了两个请求,使用了json和xml响应,结果让我感到困惑:xml响应请求花了1261 ms而json响应花费了47000 ms(!!!)
(Chrome控制台中显示的时间是使用本地IIS Express,而Postman中显示的最新时间是通过互联网在真实网络服务器上使用真实应用,这就是为什么它们不同,但规模仍然存在)
事实上,问题出在服务器端,正如一些人所建议的那样,但不是在提供数据的实际应用程序代码中,而是在序列化点。
我的Webapi是2.1(版本5.1.2)和Json.Net版本6.0.3(都是最新版本) 我没有使用任何特定json序列化程序的特殊设置,因此,据我所知,WebApi使用Json.Net。
知道什么可能导致序列化时间如此巨大的差异?
由于
答案 0 :(得分:2)
首先,感谢所有花时间掠夺此事的人。 正如我在评论 @adreno 时发布的那样,问题在于首次访问时加载了一个昂贵的计算属性。
该属性属于BL中定义的类,已在各个地方使用,所以起初我没想过要检查它。
为什么通过XML序列化将该属性排除在序列化之外?我不知道,由于时间的限制,我没有时间或特别的兴趣进一步调查(因为它不是一个开放的api,我们没有&t; t需要XML输出)。
答案 1 :(得分:1)
你如何序列化JSON?,你正在使用什么库,如果你使用的是Jackson或你的框架正在使用的其他库,我会先尝试Gson。
像我说的那样渲染一个字符串String myjson = "";
Gson gson = new Gson();
myjson = gson.toJson(myuser);//myuser is my java object
return myjson