我有一个在 Windows Server 2008 R2(数据中心版)上的 IIS 7 上运行的 Web 应用程序,使用 Visual Studio 2010 构建。当我将网站项目部署到本地 IIS 服务器或托管在托管服务的 VPS 上的生产 IIS 服务器时,可以通过访问 API 控制器/api/notifications/
,这是通过网页上的 AJAX 调用完成的。问题是,在 Amazon EC2 实例上的相同设置中,所有 API 控制器都不起作用,它们都导致 404 未找到响应。我检查了所有地方是否安装了相同版本的 .NET 框架,IIS 是否运行相同的处理程序映射、模块、ISAPI 过滤器、请求过滤和 ASP 设置是否都相同。在 EC2 实例上运行了失败的请求跟踪,没有出现与 asp 相关的错误。一切都是最新的。我尝试添加:
<modules runAllManagedModulesForAllRequests="true" />
并尝试添加:
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*"
type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified"
requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
到 web.config 文件中的适当位置,但仍然没有 api 控制器。通常,网站会部署到“wwwroot”文件夹,其他一切都正常,所以我还尝试通过创建应用程序部署到虚拟目录,访问/Test/api/notifications/
仍然导致 404(而我可以通过 访问网站的其余部分/Test/
)。
我尝试通过这篇文章重新注册该框架:http://www.aheil.de/2012/11/05/fixing-asp-net-mvc-4-web-api-404/
我确保在 IIS 配置中选中了“允许未列出的文件扩展名”。
知道为什么这在 EC2 实例上不起作用吗?
答案1
问题是,所有开发机器上都安装了 .NET Framework 4.5,但 Amazon EC2 Windows Server 2008 R2 服务器上没有安装。安装 .NET 4.5 显然也会更新旧的 4.0 程序集(特别是,我怀疑是 System.Net.Http 和 System.Web.Http),而且由于 Web 应用程序是针对这些 4.0 程序集的 4.5 版本构建的,因此在部署到 EC2 服务器上时 Web API 控制器不会初始化。
解决方案:确保 EC2 服务器上的框架程序集与开发机器上的相同:
- 在 EC2 服务器上安装 .NET 4.5
- 在开发机器上卸载.NET 4.5。
还有许多有用的信息此 MSDN 线程