首页 > 解决方案 > IIS Express 在异常时处理 HTTP 状态

问题描述

我有一个 ASP.NET Core 2.1 REST API 应用程序。我希望能够将它作为 Windows 服务以及在 IIS 上运行,因此我为每个服务创建了一个启动项目,并且它们使用共享核心库作为应用程序的“胆量”。我正在使用我认为可能会发挥作用的 CORS。

Service 项目在 Visual Studio 的 dotnet.exe 下正常运行,IIS 项目使用 Visual Studio 的 IIS Express 运行。他们的启动代码差别很小,在这篇文章的末尾。

像大多数其他 API 一样,我想依靠 Http 状态码来传达信息。在一个端点上,如果请求超过某个限制,我想使用 RequestSizeLimitAttribute 返回 413 状态。

Windows 服务项目行为正确,向客户端返回正确的状态代码。但是当我以 IIS Express 运行时,客户端首先发送一个 OPTIONS 请求并返回 204(如预期的那样),但之后的响应始终是 502-Bad Gateway。

如果由于 RequestSizeLimitAttribute 而发生异常,IIS 是否会出现问题?

//IIS Express Project Startup Code
public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IConfiguration config => new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile("appsettings.Development.json", optional: true)
        .Build();

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

 //Windows Service startup code
 public static IConfiguration config => new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile("appsettings.Development.json", optional: true)
        .Build();

 public static void Main(string[] args)
 {
     RunWebHost(args, logger);
 }

 public static void RunWebHost(string[] args)
 {
     var isService = true;

     if (Debugger.IsAttached || args.Contains("--console"))
     {
         isService = false;
     }

     var pathToContentRoot = Directory.GetCurrentDirectory();

     if (isService)
     {
        var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
        pathToContentRoot = Path.GetDirectoryName(pathToExe);
     }

     var webHostArgs = args.Where(arg => arg != "--console").ToArray();

     var host = WebHost.CreateDefaultBuilder(webHostArgs)
            .UseContentRoot(pathToContentRoot)
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .Build();

        if (isService)
        {
            host.RunAsService();
        }
        else
        {
            host.Run();
        }
 }

标签: c#windows-servicesasp.net-core-webapiiis-express

解决方案


推荐阅读