IIS Üzerinde Çalışan bir ASP.NET Core Uygulamasını HTTP İsteğiyle Sonlandırmak

Giriş

ASP.NET Core uygulamalarını IIS üzerinde çalıştırmak için uygulamanızın başlangıcında UseIISIntegration diyerek bir middleware eklendiğini bilirsiniz.

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

Metodun özet kısmındaki açıklama kısmı yeterince açıklayıcı değil.

// Summary:
//     Configures the port and base path the server should listen on when running behind
//     AspNetCoreModule. The app will also be configured to capture startup errors.
//
// Parameters:
//   hostBuilder:

Peki bu IIS Middleware ne iş yapar? ASP.NET core kodlarını inceleyerek anlamaya çalışacak, akabinde çalışan bir uygulama process’inin HTTP isteği ile durdurarak bir uygulama yapacağız.

Kodları İncelemeye Başlayalım

ASP.NET Core reposundayken T tuşuna bastığımızda Github bize fzf 1 benzeri bir arayüzle dosya arama özelliği sunuyor. Burada arayacağımız dosya IISMiddleware.cs

101 ve 109 arasındaki kısımlara bakıldığında gelen bir HTTP isteği

  • POST isteği ise
  • Request ANCMRequestPath değişkenine eşitse
  • Headerdan gelen bir MSAspNetCoreEvent değişkeninin ANCMShutdownEventHeaderValue değerine eşitse

Process sonlandırılıyor ve HTTP 202 döndürüldüğünü görüyoruz.

Kodları 2 incelediğimizde bu değişkenlerin tanımlandığı kısımda aşağıdaki tanımları görüyoruz.

public class IISMiddleware
{
    private const string MSAspNetCoreToken = "MS-ASPNETCORE-TOKEN";
    private const string MSAspNetCoreEvent = "MS-ASPNETCORE-EVENT";
    ...
    private const string ANCMShutdownEventHeaderValue = "shutdown";
    private static readonly PathString ANCMRequestPath = new PathString("/iisintegration");

Öylese biz aşağıdaki gibi bir HTTP isteği attığımızda bu process sonlanmalı.

POST /iisintegration HTTP/1.1
  MS-ASPNETCORE-EVENT: shutdown
  MS-ASPNETCORE-TOKEN: ????????

İki Soru

  • Bu HTTP POST isteğini hangi uygulamaya yapacağız?

    • Web uygulamamızın çalıştığı porttaki web uygulması
    • Arka tarafta bizim görmediğimiz bir web uygulaması
  • MS-ASPNETCORE-TOKEN token değerine nasıl ulaşacağız?

Cevaplar Environment Variables değerlerinde gizli

  • SysInternals Process Explorer 3 aracı ile uygulamanızın environmental variable değişkenlerine ulaşabilirsiniz.

ASP.NET Core Environmental Variables on Process Explorer

httpie 4 ile isteğimizi atalım.

http POST \
    :19890/iisintegration \
    MS-ASPNETCORE-EVENT:shutdown \
    MS-ASPNETCORE-TOKEN:04e9fbd1-32e2-41f3-92b9-7b560ffa1348

Powershell ile:

Invoke-WebRequest `
  -Uri http://localhost:19890/iisintegration `
  -Method POST `
  -Headers @{"MS-ASPNETCORE-EVENT"="shutdown"; "MS-ASPNETCORE-TOKEN"="04e9fbd1-32e2-41f3-92b9-7b560ffa1348"}

Stopping ASP.NET Core Application with HTTPie

Mekanizmanın Çalışması

  • IIS, her bir web uygulaması için yeni bir web uygulaması ayağa kaldırıyor.
  • PORT ve TOKEN değerlerini rastgele şekilde veriyor.
  • Bu porttaki uygulamaya “sadece localhost” üzerinden attığız bir HTTP isteği ile process durdurma işlemini gerçekleştirebiliyorsunuz.

Sonuç

Token ve Port değerleri Environmental Variable değişkenleri olduğu için bu değerleri sabit değerler olarak tanımlayabilirsiniz. Böylece sabit bir PORT ve sabit bir TOKEN değeriniz olacağı için, uygulamanızı HTTP üzerinden sabit ve küçük bir script sonlandırabilirsiniz.

Böyle bir kullanıma ihtiyacınız yüksek ihtimalle olmayacaktır, olmamalı ve olmamasını da temenni ederim.

İyi çalışmalar.