保持ASP.NET核心应用程序在IIS中始终运行

wvyml7n5  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(164)

我在IIS中托管一个ASP.NET Core(2.2)应用程序。
该应用正在使用具有以下设置的自定义应用池:

.NET CLR version: No Managed Code
Start Mode: Always Running
Idle Time-out (minutes): 0

字符串
我的启动代码看起来像:

WebHost.CreateDefaultBuilder(args)
  .UseStartup<MyStartup>() 
  .Build() 
  .Run();


我期待应用程序将始终运行,但经过一段时间后,应用程序停止后,得到下面的请求:
[Microsoft.AspNetCore.Hosting.Internal.WebHost]请求开始HTTP/1.1 POST http://127.0.0.1:43745/app/iisintegration 0 [Microsoft.AspNetCore.Hosting.Internal.WebHost]请求在5.7107毫秒内完成202
该应用程序是子应用程序。父应用程序使用不同的应用程序池,并且确实有空闲超时。
是否有一些设置我错过了保持应用程序的所有时间?

llycmphe

llycmphe1#

找到了一个有效的解决方案。您需要使用进程内托管模型托管您的ASP.NET Core 2.2应用程序。可以按照以下步骤进行操作。
1.安装应用程序调试模块(IIS)
服务器管理器>添加角色和功能>服务器角色> Web服务器(IIS)>应用程序开发>应用程序配置

  1. IIS >您的应用程序池>启动模式>始终运行
  2. IIS >应用程序池>空闲超时> 0
  3. IIS >您的应用程序>高级设置>已启用预加载> True
    1.为进程内托管模式设置您的应用程序(更改Asp.net核心模块的web.config和代码以设置正确的当前目录)
    更多信息请访问:
4xrmg8kj

4xrmg8kj2#

只是为了补充上面的答案-它在大多数情况下都能工作,但对我来说不起作用,原因是我使用的是windows身份验证,并且对应用程序的每个部分都有授权要求,包括根。
当您设置了启用预加载时,IIS将在回收应用程序池(通常在空闲1740分钟后)后尝试唤醒您的应用程序,但它将获得401,并且如果请求无法授权,则无法唤醒您的应用程序。
这意味着如果你使用Windows身份验证,你需要做两件事:
1.在IIS中允许匿名身份验证沿着Windows身份验证
1.在Program.cs中,请确保您没有强制将每个请求都授权为回退策略。如果您有以下代码,请禁用回退策略(或者更好的是添加一个仅应用于您的控制器的自定义策略:

builder.Services.AddAuthorization(options =>
{
    // try removing the fallback policy so that static html pages in wwwroot don't have to be authorized and can be accessed anonymously
    //options.FallbackPolicy = options.DefaultPolicy;
});

字符串
以下是仅应用于控制器的自定义授权策略的示例:

builder.Services.AddAuthorization(options =>
{
    // try removing the fallback policy so that static html pages in wwwroot don't have to be authorized and can be accessed anonymously
    //options.FallbackPolicy = options.DefaultPolicy;

    // Create an authorization policy which will be applied just to controllers and nothing else (denies anonymous access)
    options.AddPolicy("DenyAnonymous",
        new AuthorizationPolicy(new IAuthorizationRequirement[] {
            new DenyAnonymousAuthorizationRequirement()
        },
        new string[] {
            NegotiateDefaults.AuthenticationScheme
        }));
});

// Make sure our controllers can convert dates and times from json and that they all require authorization
builder.Services.AddControllers().AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter("DenyAnonymous")));

相关问题