You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC getJson调用控制器方法部署IIS报404

问题根因

以下几个问题共同导致请求返回404:

  • 硬编码的/Home/GetBillingCustomerByCustNum是站点绝对根路径,从报错URL看你的应用部署在IIS的/HC_RFQ子应用/虚拟目录下,请求会直接打到站点根域名,根本没进入你的应用路由匹配逻辑。
  • 之前尝试的<%= Url.Content("~/") %>是传统ASP.NET Web Form的语法,在ASP.NET Core(即你用的ASP.NET 5 MVC)的Razor引擎中完全不识别,会被当成普通字符串做URL编码,才会出现路径里带%3C%=%20Url.Content的乱码。
  • 独立外部JS文件是作为静态资源直接返回给浏览器的,不会经过Razor引擎编译,所以在外部JS里写@Url.Content只会按字面字符串输出,自然不会生成正确路径。
  • 如果IIS没装对应版本的.NET Core Hosting Bundle,也会把所有路由请求当成物理文件路径查找,直接返回404。

修复方案

按易用性优先级排序:

方案1:全局注入应用根路径(兼容所有外部JS,改动最小)

在共享布局页_Layout.cshtml的<head>标签内,先定义全局JS变量存储应用根路径,所有页面、外部JS都可以直接读取这个变量,不需要在JS文件里写任何Razor语法:

<head>
    <!-- 其他原有meta、样式引用 -->
    <script>
        // Razor渲染视图时会自动解析为正确的应用根路径,子应用部署时会自动带上/HC_RFQ前缀
        window.APP_BASE = '@Url.Content("~")';
    </script>
    <!-- 后续再引用你的自定义JS文件 -->
</head>

修改原JS里的请求逻辑,拼接这个全局路径即可:

function getCustomerOptions(cn) {
    // 替换双斜杠避免路径格式错误
    const requestUrl = (window.APP_BASE + 'Home/GetBillingCustomerByCustNum').replace(/\/\//g, '/');
    $.getJSON(requestUrl, { cust: cn }, function (data) {
        // 原有处理返回数据的逻辑
    });
}

方案2:通过DOM的data属性存储生成好的URL(适合单页面调用,无全局变量污染)

如果这个请求只在单个视图中使用,可以直接把Razor生成的正确URL存在触发元素的自定义属性上,JS直接读取属性值发起请求,不需要手动拼接路径。
比如对应输入框的代码:

<input type="text" id="customerNumInput"
       data-billing-url="@Url.Action("GetBillingCustomerByCustNum", "Home")" />

JS逻辑不管写在视图内脚本还是外部JS文件里,都可以直接读到正确路径:

function getCustomerOptions(cn) {
    const requestUrl = $('#customerNumInput').data('billing-url');
    $.getJSON(requestUrl, { cust: cn }, function (data) {
        // 原有处理返回数据的逻辑
    });
}

注意:建议优先用@Url.Action("Action名", "控制器名")生成路径,不要手动拼接控制器和方法名,后续如果调整全局路由规则,这个方法会自动适配新路径,不需要挨个改JS里的硬编码地址。

方案3:补全IIS部署配置

如果改完路径还是返回404,检查两个部署要求:

  • 服务器上已经安装和你项目.NET版本对应的ASP.NET Core Hosting Bundle,安装完成后执行iisreset重启IIS生效。没装这个组件的话IIS无法把请求转发给.NET Core应用,会把所有非静态文件请求当成物理路径查找。
  • 确认发布产出的web.config文件里存在AspNetCoreModuleV2的请求转发配置,正常用Visual Studio发布模式生成的文件会自动带这个配置,不要手动删除或修改。

之前方案失效的补充说明
  • <%= %>语法仅在Web Form视图引擎下生效,ASP.NET Core MVC用的是Razor引擎,只识别@开头的服务端渲染语法,所以你写的Web Form标签会被当成普通文本编码后输出。
  • 静态JS文件不会经过Razor编译管线,所以直接在JS文件里写Razor语法不会被解析,只会原样输出为字符串。

内容的提问来源于stack exchange,提问作者bmurrell30

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:42:20