ASP.NET Web API 站点虚拟目录可访问,但 Controller 操作返回 HTTP 503

标签 asp.net asp.net-web-api roslyn

我们未能成功使用 Windows 服务部署 OWIN Web API 服务(如 this StackOverflow question 中所述)。经过多次尝试解决该问题后,我们决定简单地创建一个 ASP.NET Web API 站点并通过 IIS 进行部署。

在本地运行时,所有操作均可访问。但是,如果我们发布网站(使用“构建”->“发布”或其任何变体),我们会观察到以下情况:

  1. 当我们浏览到计算机名称和端口时,我们会看到虚拟目录的目录列表。
  2. 当我们请求 Controller 操作时,网站会返回 HTTP 错误 503。服务不可用。
  3. 目标服务器上的 Windows 应用程序事件日志中没有记录任何错误。
  4. 当请求在托管服务器或客户端计算机上执行时,也会发生同样的情况。

URL ACL 已创建如下:

netsh http add urlacl http://+:8098/api user=Everyone

防火墙似乎没有阻止该端口(我们可以通过上面的步骤 1 访问该端口)。 URL ACL 存在,公司中的每个人都可以访问它(他们应该这样做)。我们不知道为什么会发生这种情况,并且似乎无法找到合适的答案。

有人可以提出我们可能忽略的原因或可能的解决方案吗?

更新

从 Controller 中删除逻辑并重新发布后,Windows 应用程序事件日志中出现以下(缩写)警告信息:

Event code: 3005  
Event message: An unhandled exception has occurred.  
Exception information: 
Exception type: HttpException 
Exception message: Could not find a part of the path 'D:\websites\LoggingWebApi\bin\roslyn\csc.exe'.    

这很有趣。看起来 Publish 没有在构建中分发 Roslyn 编译器。

更新2 Controller 上最简单的操作方法是这样的:

[HttpGet]
[Route("Status")]
public string Status()
{
    return "Online";
}

即使将 Roslyn 程序集手动复制到服务器的 bin 文件夹中,该方法也会返回 HTTP 503。应用程序事件日志中不会出现任何错误消息。

当此方法在本地(在我的计算机上)运行时,它会返回一个 JSON 字符串,我可以在文本编辑器中打开该字符串。

最佳答案

The URL ACL has been created as follows:

netsh http add urlacl http://+:8098/api user=Everyone

我遇到了类似的问题,最终删除了 Web 服务器上的 URL ACL 预留。这解决了它。尝试一下。

netsh http delete urlacl url=http://+:8098/api

关于ASP.NET Web API 站点虚拟目录可访问,但 Controller 操作返回 HTTP 503,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793028/

相关文章:

c# - 在给定 SyntaxTree 中的行号的情况下获取 SyntaxNode

c# - 如果已经打开,请关闭 Telerik Radgrid Editform

c# - 添加凭据 header 时出现 ASP.NET Web API 401

asp.net - 服务器端检测页面显示在 IFrame 中

c# - MongoDB 更新失败且没有错误

c# - 我可以手动硬编码 JSON 对象以由 ASP.NET Web API 返回吗?

c# - 检查 argumentSyntax 是否可以通过具有 IParameterSymbol 的方法调用

c# - 动态编译的项目丢失资源

c# - @Html.DropDownListFor 使用 ViewBag SelectedListItem 未显示所选项目

c# - 无法加载文件或程序集 'System.Data.SqlServerCe,版本 = 4.0.0.0