开发者问题收集

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