我在ASP.NET Core中开发了一个新的Web API。这个Web API应该部署在IIS中并且必须通过SSL工作,所以我在所有控制器上都有[HttpsRequired]属性。我在部署时努力使其工作,所以现在我放宽了要求并注释掉了这些属性。这样,我就能在IIS中创建两个绑定,一个用于HTTPS,一个用于HTTP。鉴于我的Web API是在ASP.NET Core中创建的,我遵循了Rick Strahl在他出色的blog post中的部署步骤。我选择了#34; No Managed Code"对于.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>
最后,为了回答您的上一个问题,Ignas,我使用使用文件系统作为方法的发布配置文件,使用发布配置来定位.NET Framework 4.5.2。鉴于我的项目是Web API而不是MVC 6 Web应用程序,发布包创建了一个独立的应用程序。由于客户端需要使用SSL调用我的Web API,我认为它必须在IIS中托管,因此运行独立应用程序是行不通的。当然,出于测试目的,我可以尝试运行它。这就是我注释掉[HttpsRequired]属性的原因。我会尝试并报告,但现在我希望我能把你所需的所有信息都提供给你。
答案 0 :(得分: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
我正在通过网址访问它:
https:// servername:serverport / RequestPortalAPI / ControllerName / ActionName
答案 1 :(得分:0)
最后,这是正确配置Widows身份验证的问题。对于Fredrik和其他任何阅读此帖的解决方案的人来说,这些是我执行的步骤:
确保&#34;谈判&#34;位于Enabled Providers列表的顶部:
现在我们正陷入问题的黑暗区域。为了使用Windows身份验证并将调用者的凭据传递到后端(在我的情况下是SQL Server数据库),必须将Web API配置为使用Kerberos。在我向微软开出机票后,我发现了这一点,并与他们的一位工程师密切合作。为此,您需要按照以下步骤操作:
为您的Web API及其运行的域帐户创建服务主体名称(SPN)。您需要运行此命令:
其中hostname是Web API的完全限定域名。 Domain \ Username是运行Web API的域帐户。您需要特殊的域权限,因此您可能希望让IT人员参与进来。此外,从现在开始,您需要通过完整的域名而不是IP地址访问Web API。 IP地址不能与Kerberos一起使用。