繁体   English   中英

在IIS下部署的ASP.Net Core Web API返回404

[英]ASP.Net Core Web API, deployed under IIS is returning 404

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

如果我尝试用Fiddler访问Web Api(我创建了一个非常简单的GET方法,该方法返回有关程序集的一些信息),则会收到404错误。 现在,我在同一台计算机上运行Fiddler,因此我尝试了所有组合(域中的localhost,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>

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

我的设置与您的设置非常接近(Asp.Net核心,Web API,IIS,HTTPS ...),在我的终端上工作正常。

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

http://本地主机:5000 / controllerName / actionName

但是我也可以通过IIS与我的Web API联系,在这种情况下,我需要使用如下网址:

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

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

例如,在我的情况下:

iis下的asp.net核心api的屏幕截图

我正在通过URL访问它:

https://服务器名称:服务器端口/ RequestPortalAPI / ControllerName / ActionName

最后,这是正确配置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)。 您需要运行以下命令:

    在此处输入图片说明

其中,主机名是您的Web API的标准域名。 域\\用户名是运行Web API的域帐户。 您需要特殊的域特权,因此您可能需要IT部门的参与。 另外,从现在开始,您需要通过完整的域名而不是IP地址来访问Web API。 IP地址不适用于Kerberos。

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

在此处输入图片说明

我们还在运行数据库的服务器上进行了一些更改,但并不是100%真正需要这些更改,因此我不会在此处添加它们,因为我什至不知道您是否使用SQL Server或其他后端存储库。

让我知道您是否也需要这些,稍后我将添加它们。

祝你好运,埃迪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM