Asp.net mvc 在IIS 7.5中返回404(本地)的AJAX调用,但在其他IIS中也适用

Asp.net mvc 在IIS 7.5中返回404(本地)的AJAX调用,但在其他IIS中也适用,asp.net-mvc,jquery,deployment,iis-7.5,Asp.net Mvc,Jquery,Deployment,Iis 7.5,我在MVC应用程序中对控制器进行AJAX调用 Controller/FunctionName $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: '/Controller/FunctionName', . . . )}; 我使用MVC4并使用上述代码中所示的jQueryAjax函数

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

Controller/FunctionName



$.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: '/Controller/FunctionName',
        .
        .
        .
        )};
我使用MVC4并使用上述代码中所示的
jQueryAjax
函数。当我从VisualStudio运行时,它工作得非常好

我将其解析到服务器机器上,正如预期的那样,它工作正常。在AJAX调用中未发现任何问题

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

我验证了构建,甚至我指向了我的web文件夹,仍然在寻找出错的地方

它在其他IIS中工作,所以它不会是一个URL解决问题是我的访客。我是否错过了任何设置或任何及时的想法来修复这将是伟大的


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

url: '/Controller/FunctionName',
如果在IIS的虚拟目录中部署应用程序,则正确的url应为:

url: '/YourAppName/Controller/FunctionName',
这就是为什么绝对不要在ASP.NET MVC应用程序中硬编码url,而是始终使用url帮助程序生成url的原因:

url: '@Url.Action("FunctionName", "Controller")',
如果这个AJAX调用位于一个单独的javascript文件中,您不能使用服务器端助手,那么您可以从您正在Ajaxing的某个DOM元素中读取这个url

例如,假设您有一个锚:

@Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" })
你可以说:

$('#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”的资源未按正确顺序设置,因此返回为未知

这对我来说很有用,我的本地主机ajax调用了我的网络服务器,它有一个不同的名称,它不应该给我一个CORS问题,但它确实给了我,这就是我的解决方案

打开IIS并单击左侧窗格中的服务器名称。在右窗格中双击中间窗格中的“处理程序映射”。在右侧窗格中,选择“查看有序列表”。从中查找“OPTIONSVerbHandler”和“svc-ISAPI-4.0_32bit”,将“OPTIONSVerbHandler”上移到“svc-ISAPI-4.0_32bit”上方

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

如果“ajax调用位于单独的javascript文件中,您无法使用服务器端帮助程序”,请使用隐藏字段将url端点存储在视图中,这只是对其的补充:

@Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller"))
并阅读js中的隐藏字段:

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

您可以在url中使用双点:

$.ajax({
   url: '../ControllerName/ActionName',
   .......
});

完全同意你的观点,达林。“它如何在一个IIS中工作,而在另一个IIS中不工作?”达林问。如果它可以在其他IIS中工作,为什么不能在其他IIS中工作?这取决于应用程序的配置方式-它是直接部署在网站中还是作为虚拟目录。@Darin最后一个问题,我是用Javascript编写的。我有你的Actionlink示例。Bt您可以在单击按钮时更新相同的场景。如何获取这些链接?您可以将链接作为HTML5 data-*属性嵌入到按钮中:
,然后在单独的javascript文件中订阅。单击此按钮的事件并使用var
url=$(this.data('url')检索url。这为我解决了这个问题。在我的例子中,Url.Action(“FunctionName”、“Controller”)没有返回正确的Url。