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

时间:2016-10-18 14:29:41

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

我在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]属性的原因。我会尝试并报告,但现在我希望我能把你所需的所有信息都提供给你。

2 个答案:

答案 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和其他任何阅读此帖的解决方案的人来说,这些是我执行的步骤:

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

    确保&#34;谈判&#34;位于Enabled Providers列表的顶部:

    enter image description here

    1. 在应用程序池中,我将Web API配置为在我的客户的UIT部门给我的帐户下运行:
    2. enter image description here

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

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

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

          enter image description here

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

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

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

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

            祝你好运, 埃迪