Microsoft.AspNet.Hostingについて

Max OS XでASP.NETを動かす - takeman's blogをやってみて気になって調べてみた

Windowsだと通常IIS上でローカルサイトを構築するんだけど、今回のMac上だとk webk kestrelコマンドでMicrosoft.AspNet.Hostingを利用してローカルサイトをホスティングしてるようだった。

Home/samples/HelloMvc/project.json

{
    "dependencies": {
        "Kestrel": "1.0.0-beta1",
        "Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
        "Microsoft.AspNet.Hosting": "1.0.0-beta1",
        "Microsoft.AspNet.Mvc": "6.0.0-beta1",
        "Microsoft.AspNet.Server.WebListener": "1.0.0-beta1"
    },
    "commands": {
        "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001",
        "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
    },
     "frameworks": {
        "aspnet50": {},
        "aspnetcore50": {}
  }
}

探したらやっぱりMicrosoft.AspNet.Hosting名前空間ソースコードgithubに置いてあった

aspnet/Hosting · GitHub

Main関数は今度じっくり読む

Hosting/Program.cs at dev · aspnet/Hosting · GitHub

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.DependencyInjection.Fallback;
using Microsoft.Framework.Logging;
using Microsoft.Framework.Runtime;
 
namespace Microsoft.AspNet.Hosting
{
    public class Program
    {
        private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini";
 
        private readonly IServiceProvider _serviceProvider;
 
        public Program(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
 
 
 
        public void Main(string[] args)
        {
            var config = new Configuration();
            if (File.Exists(HostingIniFile))
            {
                config.AddIniFile(HostingIniFile);
            }
            config.AddEnvironmentVariables();
            config.AddCommandLine(args);
 
            var services = HostingServices.Create(_serviceProvider, config)
                .BuildServiceProvider();
 
            var appEnv = services.GetRequiredService<IApplicationEnvironment>();
            var hostingEnv = services.GetRequiredService<IHostingEnvironment>();
 
            var context = new HostingContext()
            {
                Services = services,
                Configuration = config,
                ServerName = config.Get("server"), // TODO: Key names
                ApplicationName = config.Get("app")  // TODO: Key names
                    ?? appEnv.ApplicationName,
                EnvironmentName = hostingEnv.EnvironmentName,
            };
 
            var engine = services.GetRequiredService<IHostingEngine>();
            var loggerFactory = services.GetRequiredService<ILoggerFactory>();
            var appShutdownService = _serviceProvider.GetRequiredService<IApplicationShutdown>();
            var shutdownHandle = new ManualResetEvent(false);
 
            var serverShutdown = engine.Start(context);
 
            appShutdownService.ShutdownRequested.Register(() =>
            {
                try
                {
                    serverShutdown.Dispose();
                }
                catch (Exception ex)
                {
                    var logger = loggerFactory.Create<Program>();
                    logger.WriteError("TODO: Dispose threw an exception", ex);
                }
                shutdownHandle.Set();
            });
 
            var ignored = Task.Run(() =>
            {
                Console.WriteLine("Started");
                Console.ReadLine();
                appShutdownService.RequestShutdown();
            });
 
            shutdownHandle.WaitOne();
        }
    }
}