【问题标题】:Hosting net core 2.0 app on iis gives internal server error在 iis 上托管 net core 2.0 应用程序会导致内部服务器错误
【发布时间】:2017-12-27 10:18:40
【问题描述】:

我有一个 .net 核心 web api 应用程序,在 localhost 上,它在 iis express 和默认 iis 上都运行良好。在我的 Web 服务器上,我想将我的应用程序托管为 Asp.Net v4.0 应用程序下的子应用程序。我创建了一个子应用程序并部署了我的核心应用程序,然后创建了一个no managed 应用程序池并为我的网络核心子应用程序选择了这个应用程序池。我已经完全安装了 .net core 2.0 windows hosting bundle 和 .net core 2.0 SDK。

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=".\MyApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

StartUp类'Configure方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory logger)
{
    logger.AddFile(Configuration.GetValue<string>("LogPath"));
    app.UseDeveloperExceptionPage();
    app.UseDatabaseErrorPage();
    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();

    // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAppV1");
    });


    app.UseMvc();
    //app.UseMiddleware<LoggingMiddleWare>();
}

程序.cs

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

所以当我从 api 调用端点时,它返回 500 Internal server error。

尽管我的 stdoutlog 已启用,但没有创建任何日志文件,也看不到任何正确的事件日志。

【问题讨论】:

  • docs.microsoft.com/en-us/aspnet/core/publishing/iis 的 IIS 配置、疑难解答提示和常见错误部分你看过了吗?
  • @MartinUllrich 我按照本文档的说明进行操作,但是,关于将 .net 核心应用程序作为 .net 4.0 应用程序池下的子应用程序托管的信息非常有限,此信息为 here,它只显示日志配置,我无法知道我正在做的事情是否可行或如何克服我的错误。

标签: c# iis .net-core asp.net-core-2.0


【解决方案1】:

这里确实不足以明确回答您的问题,但基于您将其作为 ASP.NET 4 应用程序下的虚拟应用程序托管的事实,最可能的罪魁祸首是 Web.config。 Web.config 文件由应用程序继承。结果,您的主应用程序 (ASP.NET 4) Web.config 中的任何内容,在您的子应用程序 (ASP.NET Core 应用程序) Web.config 中没有明确定义的任何内容,都会顺其自然,而且很可能有与 ASP.NET Core 应用程序不兼容的部分。

防止这种情况的唯一真正方法是编辑主应用程序的 Web.config 并将inheritInChildApplications="false" 显式添加到几乎每个配置部分。这必须为每个部分单独完成;没有全局方法来禁用继承。

不能保证有人不会用某些东西修改父 Web.config 并忘记将此属性添加到新部分,所以这也是一个非常脆弱的解决方案。一般来说,嵌套 ASP.NET 应用程序是一个坏主意,嵌套一个 ASP.NET Core 应用程序是一个更糟糕的主意。我建议简单地给它自己的网站并托管在一个子域上。这样你的问题就会少得多。

【讨论】:

    【解决方案2】:

    尽管我的 stdoutlog 已启用,但没有创建任何日志文件

    如果应用程序有权创建日志目录(查看Windows Logs / Application),请检查事件查看器(Windows + R,键入 eventvwr)。

    其中一种解决方法是在 IIS 中指定的部署目录中创建logs 文件夹(与Web.config 处于同一级别,根据stdoutLogFile=".\logs\stdout" 设置)

    希望这将帮助您在日志中找到 500 错误的原因


    编辑:您可以在发布过程中创建logs 目录,如here 所述

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-13
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多