Server 2012 .NET Core 2 App 在 Kestrel 上运行良好,但在 IIS 7 上运行不正常,可能是 CORS 问题

Server 2012 .NET Core 2 App runs fine on Kestrel, but not IIS 7, likely a CORS issue

我编写了一个 .NET Core 2 应用程序作为后端 API 应用程序。它在 Visual Studio 2017 年运行良好,并且在我的开发机器上运行良好。前端为Angular.

它在端口 55564 上运行。Angular 在同一台服务器上运行,但端口 80。

服务器是带有 IIS-7 的 Server 2012。我按照在互联网上找到的说明进行设置,但无法让 IIS 为页面提供服务。我不断收到错误 400(不是 404),这似乎是某种类型的 CORS 问题。我确实在我的应用程序中实施了 CORS。

当我直接在 web root 中打开命令提示符,并使用 'dotnet XXXXX.dll' 直接启动 Kestral 时,它运行良好。一切运行良好。 所以现在,它是来自命令提示符的 运行 并且运行良好。这意味着这是一个配置错误,而不是在我的应用程序中。但我确实想从 IIS 中获取它 运行。我真的不知道我错过了什么。

IIS 7 - 设置 我创建了一个标准网站。我将它设置为 'no managed code'。我设置主机 headers 来响应 'localhost:55564'。在应用程序池中,我将身份分配给具有 Web 根文件夹的完全所有权的特定用户 ID。

在我的全局 HandlerMappings 中。 选项VerbHandler * 对于路径 处理程序是 IsapiModule 可执行文件:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

然后我将选项动词推送为第一个处理程序映射。

在我的 program.cs:

WebHost
.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole();
    logging.AddDebug();
})
.CaptureStartupErrors(true)
.UseStartup<Startup>()
.UseUrls("http://*:55564")
.Build();

在我的 startup.cs 中,在 ConfigureServices 下:

services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy",
        builder => builder.AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());
});

在我的 startup.cs 配置下:

app.UseAuthentication();

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
app.UseCors("CorsPolicy");
app.UseMvcWithDefaultRoute();

我的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="dotnet" arguments=".\XXXXX.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*"/>
        <add name="Access-Control-Allow-Headers" value="Content-Type"/>
        <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
      </customHeaders>
    </httpProtocol>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule"/>
      <remove name="OPTIONSVerbHandler"/>
    </modules>
  </system.webServer>
</configuration>

我没主意了。我看了几十个帖子。不确定我错过了什么。

但由于它是从命令行运行的,而不是从 IIS-7 运行的,我相信这一定是 IIS-7 配置问题。

您可以尝试在 startup.cs 中添加 UseIISIntegration() 吗?

WebHost
.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole();
    logging.AddDebug();
})
.CaptureStartupErrors(true)
.UseIISIntegration()
.UseStartup<Startup>()
.UseUrls("http://*:55564")
.Build();