【问题标题】:AJAX Call returning 404(Local) in IIS 7.5 but same works in other IISAJAX 调用在 IIS 7.5 中返回 404(Local),但在其他 IIS 中同样有效
【发布时间】:2013-06-27 08:02:19
【问题描述】:

在我的 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

我验证了构建,甚至我指向了我的 web 文件夹,并且仍在寻找出了什么问题!

它可以在其他 IIS 中使用,所以我猜它不会是 URL 解析问题。我是否缺少任何设置或任何及时的想法来解决这个问题。

谢谢

【问题讨论】:

    标签: asp.net-mvc jquery deployment iis-7.5


    【解决方案1】:

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

    url: '/Controller/FunctionName',
    

    如果您将应用程序部署在 IIS 的虚拟目录中,正确的 url 应该是:

    url: '/YourAppName/Controller/FunctionName',
    

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

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

    如果此 AJAX 调用位于一个单独的 javascript 文件中,您无法使用服务器端帮助程序,那么您可以从您正在 AJAX 化的某个 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 助手

    【讨论】:

    • 完全同意你@Darin。它是如何在一个 IIS 中工作而在其他 IIS 中不工作的?
    • @Darin 同样的问题。如果它可以在其他 IIS 中运行,为什么不能在其他 IIS 中运行?
    • 这取决于应用程序的配置方式 - 是直接部署在网站中还是作为虚拟目录。
    • @Darin 最后一个问题是用 Javascript 写这个。我得到了你的 Actionlink 示例。 Bt您可以在按钮单击时更新相同的场景。我如何获得这些链接?
    • 您可以将链接作为 HTML5 data-* 属性嵌入到按钮中:<input type="button" id="myButton" data-url="@Url.Action("SomeAction", "SomeController")" value="click me" />,然后在您单独的 javascript 文件中订阅此按钮的 .click 事件并使用 var 检索 url url = $(this).data('url');.
    【解决方案2】:

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

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

    并阅读您的 js 中的隐藏字段:

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

    【讨论】:

      【解决方案3】:

      您可以在网址中使用双点:

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

      【讨论】:

      • 这解决了我的问题。在我的情况下 Url.Action("FunctionName", "Controller") 没有返回正确的 URL。
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2023-04-11
        • 2012-10-25
        相关资源
        最近更新 更多