ASP.Net Core Web API,在IIS下部署时返回404错误。

3
我有一个新的ASP.NET Core Web API。这个Web API需要在IIS上部署,并且必须通过SSL工作,因此我在所有控制器上都使用了[HttpsRequired]属性。我努力让它在部署时正常工作,但目前为止,我放松了要求并注释掉了这些属性。这样做后,我能够在IIS中创建两个绑定,一个用于HTTPS,另一个用于HTTP。由于我的Web API是使用ASP.NET Core创建的,所以我按照Rick Strahl在他的优秀博客文章blog post中的部署步骤进行操作。我选择了".NET CLR版本"的"No Managed Code"。IIS机器是一个64位的Windows Server 2012 R2环境-不确定是否重要。.NET Core Windows Server Hosting包已安装在服务器上,并且我可以在模块网格中看到AspNetCoreModule。
如果我尝试使用Fiddler访问Web Api(我创建了一个非常简单的GET方法,返回有关程序集的一些信息),我会收到404错误。目前,我在同一台机器上运行Fiddler,因此我尝试了所有组合(本地主机名、IP地址和完整机器名称在域中)。
在EventViewer中没有记录任何错误。有人对如何解决这个问题有什么建议吗?
TIA, Eddie 编辑1:这是我的控制器:
[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]属性。我会尝试并报告结果,但现在我希望我提供了您所需的所有信息。


展示你的控制器和操作设置。 - Mike_G
请提供web.config文件的内容。 - Ignas
1
你是在构建一个自包含的应用程序(exe)还是框架相关的(dll)?如果你直接运行它,而不是通过IIS,它能正常工作吗? - Ignas
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Eddie
2个回答

1

我的设置与你非常接近(Asp.Net Core、Web API、IIS、HTTPS...),在我的端上运行良好。

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

http://localhost:5000/controllerName/actionName

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

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

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

例如,在我的情况下:

asp.net core api 在 iis 下的截图

我通过以下 URL 进行访问:

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


我尝试在URL中添加应用程序名称,但仍然没有成功。在IIS中,我添加了一个新的网站,并将文件夹设置为我在VS2015中发布时生成的可执行文件所在的文件夹。那里有一个web.config文件(我在我的第一个编辑中列出了它的内容)。你用什么字符串作为你的“applicationName”?是在IIS中创建的网站名称吗?感谢您的帮助-我非常感激。 - Eddie
在IIS Manager应用程序中,我有一个网站:我添加了一个网站,在此网站下,我将我的asp.net core项目部署的文件夹转换为一个应用程序,也许这是你所缺失的部分? - Daboul
我已经编辑了我的回答,并附上了截图和相应的URL。 - Daboul
嗨Daboul,我已经证明了我的问题与Windows身份验证有关。如果我将其配置为使用匿名身份验证工作,我就可以得到... - Eddie
不使用Windows身份验证时是否有解决方案?遇到了同样的问题,但需要匿名身份验证。在DNC 2.1 Web API中,Hello World应用程序在没有此404错误弹出的情况下无法正常工作。权限看起来没问题。 :( - MC9000
显示剩余2条评论

0
最终,这只是一个正确配置Windows身份验证的问题。对于Fredrik和其他阅读此帖子以寻求解决方案的人来说,这是我执行的步骤:
  1. 在我的Web API的身份验证表单中,我在IIS中禁用了匿名身份验证并启用了Windows身份验证:

enter image description here

确保“Negotiate”位于已启用提供程序列表的顶部:

enter image description here

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

enter image description here

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

enter image description here

现在我们进入问题的黑暗区域。为了使用Windows身份验证,并将调用方的凭据传递到后端(在我的情况下是SQL Server数据库),Web API必须配置为使用Kerberos。我在向Microsoft提出工单并与他们的一位工程师密切合作后发现了这一点。要实现这一点,您需要按照以下步骤进行操作:

  1. 为您的Web API和其运行的域帐户创建服务主体名称(SPN)。您需要运行此命令:

    enter image description here

其中,主机名是您的Web API的完全限定域名。Domain\Username是Web API正在运行的域账户。您需要特殊的域权限,因此您可能需要涉及IT中的某些人。此外,从现在开始,您需要通过完整的域名访问您的Web API,而不是通过IP地址。IP地址在Kerberos中无法正常工作。

此外,在 IT 人员的帮助下,您需要启用委派,以便任何使用 Kerberos 的服务都能够委派到您运行 Web API 的域帐户。在“活动目录用户和计算机”中,找到您用于运行 Web API 的帐户,打开其属性,单击“委派”选项卡,启用第二个选项“信任此用户委派到任何服务(仅限 Kerberos):”

enter image description here

我们还对运行数据库的服务器进行了一些更改,但我并不确定这些更改是否真正需要,因此我不会在此处添加它们,因为我甚至不知道您是否使用SQL Server或其他后端存储库。
如果您需要这些更改,请告诉我,我稍后会添加它们。
祝好运, Eddie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接