[英]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的原因,因为您使用的路径不正确?
例如,在我的情况下:
我正在通过URL访问它:
https://服务器名称:服务器端口/ RequestPortalAPI / ControllerName / ActionName
最后,这是正确配置Widows身份验证的问题。 对于Fredrik和其他阅读此帖子以寻求解决方案的人,这些是我执行的步骤:
确保“协商”位于“已启用的提供程序”列表的顶部:
现在我们进入问题的黑暗领域。 为了使用Windows身份验证并将调用者的凭据传递到后端(在我的情况下为SQL Server数据库),必须将Web API配置为使用Kerberos。 在与Microsoft取得联系后,我发现了这个问题,并且与他们的一位工程师紧密合作。 为此,您需要按照以下步骤操作:
其中,主机名是您的Web API的标准域名。 域\\用户名是运行Web API的域帐户。 您需要特殊的域特权,因此您可能需要IT部门的参与。 另外,从现在开始,您需要通过完整的域名而不是IP地址来访问Web API。 IP地址不适用于Kerberos。
我们还在运行数据库的服务器上进行了一些更改,但并不是100%真正需要这些更改,因此我不会在此处添加它们,因为我什至不知道您是否使用SQL Server或其他后端存储库。
让我知道您是否也需要这些,稍后我将添加它们。
祝你好运,埃迪
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.