ASP.NET/WebAPI:$.ajax 出现 404 且 $.getJSON 出现未捕获的 RangeError:超出最大调用堆栈大小
2015-06-29
179
我正在使用 C# 项目开发 ASP.NET Web API,尝试从 JavaScript 调用它。
这是我的 JavaScript:
function LoadGraph() {
var file = document.getElementById("file-datas");
if ('files' in file)
{
if (file.files.length == 0) {
Console.log("Empty file");
} else {
var text = file.files;
/*$.ajax({
url: "api/Graph",
type: "POST",
dataType: "json",
processData: false,
contentType: false,
data: $(text).serialize(),
cache: false,
success: function (data) {
console.log(data);
}
})*/
//$.getJSON('api/Graph', file, function (data) { console.log(data) });
}
}
这是我的控制器:
[Authorize]
[RoutePrefix("api/Graph")]
public class GraphController : ApiController
{
// POST: api/Graph
[HttpPost]
[Route("All", Name = "LoadGraph")]
public IHttpActionResult LoadGraph(string text)
{
RecursiveGraph result = test.SecondMethodFruchterman(text);
return Ok(result.name);
}
}
如您所见,我在 JavaScript 中尝试了两种方法:
-
第一个使用 $.ajax 的方法会导致
POST http://localhost:53497/Home/api/Graph 404 (Not Found)
。 -
第二个使用 $.getJSON 的方法会导致
Uncaught RangeError: Maximum call stack size reached
。
result.name 是一个字符串,但我想在解决这些问题并获得可行的结果后传输结果本身。
- 我不知道这两种方法中的哪一种更好使用。
- 我不知道为什么我在 $.ajax 上收到 404 错误,而在 $.getJSON 上没有。
- 我不知道为什么我会得到这个 Max 调用堆栈错误,因为它似乎在调用递归函数时出现,但这里不是这种情况。
3个回答
第一个问题是解析的 URL 是
POST http://localhost:53497/Home/api/Graph 404 (Not Found)
,这是错误的,因为您的 URL 实际上应该是
http://localhost:53497/api/Graph
。要修复,请在您的 AJAX URL 前面添加
/
。
第二个问题可能是服务器错误以文本形式返回到您的 Web 客户端。这可能是由于您的递归永不终止。我无法详细查看该代码,但
RecursiveGraph result
提示了我。我敢打赌您的递归方法永不终止,这肯定会使调用堆栈最大化。
Haney
2015-06-29
我认为您应该将
ajax
调用更改为:
$.ajax({
url: '@Url.Action("LoadGraph", "Graph")',
type: "POST",
traditional: true,
data: {
text: $(text).serialize()
},
cache: false,
success: function (data) {
console.log(data);
}
})
您收到 404(未找到错误代码)是因为您的 ajax 发布网址
api/Graph
只是您引用的控制器
您为什么要将控制器 RoutePrefix 更改为“api/Graph”?这样做有什么特殊原因吗?
brothers28
2015-06-29
这里是更正后的代码
//[Authorize]
[RoutePrefix("api/Graph")]
public class GraphController : ApiController
{
// POST: api/Graph
[Route("LoadGraph", Name = "LoadGraph")]
public IHttpActionResult LoadGraph([FromBody] string text)
{
RecursiveGraph result = test.SecondMethodFruchterman(text);
return Ok(result);
}
}
我需要添加 [FromBody] 因为字符串不是模型。
elpha01
2015-06-30