部署到 IIS 后,对控制器的 API 调用中断

Posted

技术标签:

【中文标题】部署到 IIS 后,对控制器的 API 调用中断【英文标题】:API Calls to controller is breaking after deploying to IIS 【发布时间】:2018-07-31 14:26:21 【问题描述】:

我正在调用 API 调用以使用 javascript 从服务器获取 JSON 数据。

$(function () 

    var customersTable = $('#Customers');
    var returnCustomersTable = UpdateDataTable(customersTable, "/Customers/Loaddata");

当我使用 Visual Studio 开发环境时,这可以正常工作,因为我的 Web 应用程序在 root 上,所以所有 javascripts 都可以正常工作。

例子:

我的网站 URL: http://localhost:4391API 调用将是: http://localhost:4391/Customers/Loaddata

这很好用。

但是当我将应用程序部署到 IIS 时,我的网站 URL 将是,

我的网站网址: http://localhost/MyAppName

但 API 调用仍然是, API 调用将是:http://localhost/Customers/Loaddata,这将导致找不到。

由于我在单独的文件中使用 javascript,我将无法执行 URL.Action

另一种选择是为 dev 和 prod 创建一个基本 URL,并在每个 servcie 调用中附加。

但我正在考虑是否有其他方法。

【问题讨论】:

单独的js文件没有区别。始终使用Url.Action() 生成您的网址。有很多方法可以做到这一点。例如,只需在主视图中添加一个全局 var url = '@Url.Action(...) 即可从插件中读取。或者,如果您要处理元素的事件,则在元素中添加一个data-url="@Url.Action(...)" 属性,该属性可以在外部文件中读取(使用var url = $(this).data('url'); 这可能会对您有所帮助。 ***.com/questions/9703090/… 【参考方案1】:

ASP.NET MVC 中的路由配置旨在用作应用程序中的单一位置,可以维护所有 URL。

如果所有 URL 都是通过基于 UrlHelper 的方法之一(例如 Url.Action())使用路由生成的,而不是硬编码在控制器和视图中,这将大大有助于维护项目。

只要您的 JavaScript 在 MVC 视图中,您就可以解析 Url.Action 内联。

$(function () 

    var customersTable = $('#Customers');
    var returnCustomersTable = UpdateDataTable(customersTable, 
        '@Url.Action("Loaddata", "Customers")');

如果 JavaScript 位于 MVC 之外的单独文件中,请考虑通过变量或函数参数传递 URL。

这个路由特性也使得 ASP.NET MVC 的部署变得更加容易,因为当应用程序没有部署到根网站虚拟目录时,生成的 URL 会适应使用应用程序路径。

在 IIS 网站根目录中运行的应用程序:

/Customers/Loaddata

在配置为名为“MyAppName”的 IIS 应用程序的虚拟子目录中运行的应用程序:

/MyAppName/Customers/Loaddata

【讨论】:

以上是关于部署到 IIS 后,对控制器的 API 调用中断的主要内容,如果未能解决你的问题,请参考以下文章

Windows Server 2008 R2 升级之2016域控部署

IIS6.0中部署webapi 提示404

ASP.NET Core api 项目 3.1 在 IIS 上发布

仅在 IIS 部署后的 Asp.net Web api 异常:名为“HelpPage_Default”的路由已在路由集合中

在将 web api 部署到天蓝色之后,从 api 到类库的每个调用都失败了

vue项目部署iis服务器