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
相关产品推荐
相关产品推荐

