AJAX调用在IIS 7.5中返回404(本地),但在其他IIS中也一样

我在我的MVC应用程序中对我的控制器进行了AJAX调用

Controller/FunctionName $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: '/Controller/FunctionName', . . . )}; 

我正在使用MVC 4并使用JQUERY Ajax函数,如上面的代码所示。 当我从Visual studio运行时它完全正常。

我将它解密到服务器机器,并按预期正常工作 。 在AJAX调用中没有发现任何问题。

现在我正在尝试在我的本地机器IIS中部署它,这与我的服务器版本(IIS 7.5)相同,但是在firebug中获取所有ajax调用的404

我validation了构建,甚至我指向我的网络文件夹,我仍在寻找出了什么问题!

它适用于其他IIS,所以它不会是一个URL解决问题是我的意见。 我错过了任何设置或任何及时的想法来解决这个问题会很棒。

谢谢

这很正常。 您已将url硬编码为控制器操作:

 url: '/Controller/FunctionName', 

如果在IIS中的虚拟目录中部署应用程序,则正确的URL应为:

 url: '/YourAppName/Controller/FunctionName', 

这就是为什么你绝对不应该在ASP.NET MVC应用程序中硬编码URL但是总是使用url helper来生成它的原因:

 url: '@Url.Action("FunctionName", "Controller")', 

如果这个AJAX调用是在一个单独的javascript文件中,你不能使用服务器端助手,那么你可以从一些你是AJAXifying的DOM元素中读取这个url。

例如,假设你有一个锚点:

 @Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" }) 

你AJAXify:

 $('#myLink').click(function() { $.ajax({ url: this.href, contentType: 'application/json; charset=utf-8', type: 'GET', . . . )}; return false; }); 

注意我们如何从帮助器生成的DOM元素中读取url。

结论和2条经验法则:

  • 永远不要在ASP.NET MVC应用程序中硬编码URL
  • 在ASP.NET MVC应用程序中处理url时, 绝对总是使用url帮助程序

我在IIS7.5的设置中发现的是“处理程序映射”有一个名为“OPTIONSVerbHandler”的资源未按正确的顺序设置,因此返回为Unknown。

这项工作对我来说,我的localhost ajax调用我的网络服务器,它有一个不同的名称,它不应该给我一个CORS问题,但它确实,这是我的解决方案。

打开IIS,然后单击左窗格中的服务器名称。 在右侧窗格中,双击中间窗格中的“处理程序映射”。 在右侧窗格中,选择“查看有序列表”。 从那里找到’OPTIONSVerbHandler’和’svc-ISAPI-4.0_32bit’,向上移动’OPTIONSVerbHandler’直到它高于’svc-ISAPI-4.0_32bit’。

确保ajax调用中的“处理程序”中没有“Access-Control-Allow-Origin”。

只是Darin答案的补充,如果“AJAX调用是在一个单独的javascript文件中,你不能使用服务器端助手”,请使用隐藏字段在视图中存储url端点:

 @Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller")) 

并在你的js中读取隐藏的字段:

 url: $("#URLEndpointName").val(),