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

时间:2018-01-21 02:24:07

标签: iis-7 cors .net-core

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

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

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

当我直接在Web根目录中打开命令提示符,并使用“dotnet XXXXX.dll”直接启动Kestral时,它运行正常。一切都很好。 所以现在,它从命令提示符运行并且完美运行。这意味着它是一个配置错误,而不是在我的应用程序中。但我确实想让它从IIS运行。我真的无法弄清楚我错过了什么。

IIS 7 - 安装程序 我创建了一个标准网站。我将其设置为“无托管代码”。我设置主机头以响应'localhost:55564'。在应用程序池中,我将标识分配给具有Web根文件夹完全所有权的特定用户标识。

在我的全局HandlerMappings中。     OPTIONSVerbHandler     *路径     处理程序是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中,在Configure:

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配置问题。

1 个答案:

答案 0 :(得分:1)

您可以尝试在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();