【问题标题】:ASP.Net Core Web API, deployed under IIS is returning 404在 IIS 下部署的 ASP.Net Core Web API 返回 404
【发布时间】:2016-10-18 14:29:41
【问题描述】:

我有一个用 ASP.NET Core 开发的新 Web API。这个 Web API 应该部署在 IIS 中,并且必须通过 SSL 工作,所以我的所有控制器上都有 [HttpsRequired] 属性。我在部署时很难让它工作,所以现在我放宽了要求并注释掉了这些属性。这样做,我能够在 IIS 中创建两个绑定,一个用于 HTTPS,一个用于 HTTP。鉴于我的 Web API 是在 ASP.NET Core 中创建的,我遵循了 Rick Strahl 在他出色的 blog post 中的部署步骤。我为 .NET CLR 版本选择了“无托管代码”。 IIS 机器是 64 位 Windows Server 2012 R2 环境 - 不确定这是否重要。 .NET Core Windows Server Hosting bundle 已安装在服务器上,我可以看到模块网格中列出的 AspNetCoreModule。

如果我尝试使用 Fiddler 访问 Web Api(我创建了一个非常简单的 GET 方法来返回有关程序集的一些信息),我会收到 404 错误。目前,我在同一台机器上运行 Fiddler,所以我尝试了所有组合(本地主机、IP 地址和域中的完整机器名称)。

EventViewer 中没有记录错误。有人对如何解决此问题有任何建议吗?

TIA, 埃迪

EDIT1:这是我的控制器:

[Route("api/info")]
//[RequireHttps]
public class InfoController : Controller
{
  private ITncRepository _repository;
  public static ApplicationAssemblyDetails ApplicationAssemblyDetails { get; set; }

  public InfoController(ITncRepository repository)
  {
     _repository = repository;
     ApplicationAssemblyDetails = ApplicationAssemblyDetails.Current;
  }

  [HttpGet("")]
  public JsonResult Get()
  {
     return Json(new WebApiInfoModel()
                     {
                        CurrentTime  = DateTime.Now,
                        CurrentUtcTime = DateTime.UtcNow,
                        AssemblyName = ApplicationAssemblyDetails.ApplicationAssembly.FullName,
                        VersionNumber = ApplicationAssemblyDetails.VersionNumber,
                        BinFolder = ApplicationAssemblyDetails.BinFolder,
                        BuildMode = ApplicationAssemblyDetails.BuildMode,
                        TradeMark = @" © 2016-2017 * SomeCompany (www.somecompany.com)"
     });
  }
}

ApplicationAssemblyDetails 是一个 nuget 包,它提供有关当前程序集的一些信息。 WebApiInfoModel 是我想要作为测试传回给客户端的 Web API 信息的模型类。

web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\My_ASP_NET_Core_Web_API.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" />
  </system.webServer>
</configuration>

最后,为了回答您的最后一个问题,Ignas,我使用发布配置文件,该配置文件使用文件系统作为方法,以 .NET Framework 4.5.2 为目标,使用发布配置。鉴于我的项目是 Web API 而不是 MVC 6 Web 应用程序,发布包创建一个独立的应用程序。由于客户端需要使用 SSL 调用我的 Web API,我认为它必须托管在 IIS 中,因此运行独立应用程序将无法正常工作。当然,出于测试目的,我可以尝试运行它。这就是我注释掉 [HttpsRequired] 属性的原因。我会尝试并报告,但现在我希望我已经为您提供了您需要的所有信息。

【问题讨论】:

  • 向我们展示您的控制器和操作设置
  • 请提供 web.config 内容
  • 您是在构建自包含应用程序 (exe) 还是依赖于框架 (dll)?如果你直接运行它,而不是通过 IIS,它可以工作吗?
  • 是的,Ignas,它作为一个独立的应用程序工作,但该应用程序只监听“localhost:5000”,这对我们的客户不利。

标签: c# asp.net-web-api asp.net-core iis-6


【解决方案1】:

我的设置与您的非常接近(Asp.Net 核心、Web API、IIS、HTTPS ...)在我这边运行良好。

我在某些时候遇到过同样的问题,因为我没有使用正确的路径来访问我的控制器/操作,这取决于您如何在 IIS 下部署它。例如,就我而言,当我直接使用 Kestrel 时,它会通过这样的 URL:

http://localhost:5000/controllerName/actionName

但我也可以通过 IIS 联系我的 Web API,在这种情况下,我需要使用这样的 URL:

http://localhost:5001/applicationName/controllerName/actionName

您是否在 IIS 下创建了一个应用程序,该应用程序可以解释您因为没有使用正确的路径而得到 404?

以我为例:

screenshot of the asp.net core api under iis

我正在通过 URL 访问它:

https://servername:serverport/RequestPortalAPI/ControllerName/ActionName

【讨论】:

  • 我尝试在 URL 中添加应用程序名称,但仍然没有成功。在 IIS 中,我添加了一个新网站,并将文件夹设置为我在 VS2015 中发布时生成的可执行文件所在的文件夹。那里有一个 web.config 文件(我在第一次编辑中列出了它的内容)。您为“应用程序名称”使用了什么字符串?在 IIS 中创建的网站名称?感谢您提供帮助 - 我真的很感激。
  • 在 IIS 管理器应用程序中,我有:我添加的一个网站,在这个网站下,我将我的 asp.net 核心项目部署到的文件夹变成了一个应用程序,也许是它的一部分你失踪了?
  • 我已经用屏幕截图和相应的 URL 编辑了我的答案。
  • 嗨 Daboul,我能够证明自己的问题与 Windows 身份验证有关。如果我将其配置为使用匿名身份验证,O 得到
  • @Eddie,你解决了这个问题吗?我有完全相同的问题,我也在使用 Windows 身份验证。
【解决方案2】:

最后,这是正确配置 Widows 身份验证的问题。对于 Fredrik 和其他阅读这篇文章以寻求解决方案的人,这些是我执行的步骤:

  1. 在 IIS 中,在我的 Web API 的身份验证表单中,我禁用了匿名身份验证并启用了 Windows 身份验证:

确保“协商”位于已启用提供商列表的顶部:

  1. 在应用程序池中,我将 Web API 配置为在客户的 UIT 部门为我提供的帐户下运行:

  1. 我的 Web API 的配置文件 (web.config) 包含以下设置:

现在我们正在进入问题的黑暗领域。为了使用 Windows 身份验证并将调用者的凭据传递到后端(在我的例子中是 SQL Server 数据库),必须将 Web API 配置为使用 Kerberos。我在与 Microsoft 开票后发现了这一点,并与他们的一位工程师密切合作。为此,您需要执行以下步骤:

  1. 为您的 Web API 及其运行所在的域帐户创建一个服务主体名称 (SPN)。你需要运行这个命令:

其中 hostname 是您的 Web API 的完全限定域名。 Domain\Username 是运行 Web API 的域帐户。您需要特殊的域权限,因此您可能需要 IT 人员参与。此外,从现在开始,您需要通过完整的域名访问您的 Web API,而不是通过 IP 地址。 IP 地址不适用于 Kerberos。

  1. 此外,在您的 IT 人员的帮助下,您需要为运行 Web API 的域帐户使用 Kerberos 为任何服务启用委派。在 Active Directory 用户和计算机中,找到您用于运行 Web API 的帐户,调出其属性,单击委派选项卡并启用第二个选项“信任此用户以委派任何服务(仅限 Kerberos):李>

我们也在运行我们数据库的服务器上做了一些改动,但我不是 100% 真正需要的,所以我不会在这里添加它们,因为我什至不知道你使用的是 SQL Server 还是一些其他后端存储库。

如果您也需要这些,请告诉我,我稍后会添加它们。

祝你好运, 埃迪

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2015-08-22
    • 2022-06-28
    • 2017-12-10
    • 2021-10-15
    • 2018-06-30
    • 1970-01-01
    • 2013-03-01
    • 2019-01-06
    相关资源
    最近更新 更多