Microsoft.AspNet.Hostingについて
Max OS XでASP.NETを動かす - takeman's blogをやってみて気になって調べてみた
Windowsだと通常IIS上でローカルサイトを構築するんだけど、今回のMac上だとk web
やk 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に置いてあった
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(); } } }