Archive - 2015.03
グラニのC#フレームワークの過去と未来、現代的なASP.NETライブラリの選び方
- C# - 15.03/25
Build Insider MEETUP with Graniというイベントで、グラニのC#フレームワーク(というほどのものはない!)の今までとこれからってのを話しました。
そのうちBuild Insiderで文字起こしとか公開されると思います。
2015年の今、どういうライブラリを選んだか、とかNLog大脱却、とかって話が見どころですかね。うちの考えるモダンなやり方、みたいな感じです。
実際、EventSourceやSemantic Logging Application Blockは良いと思いますので、触ってみるといいですね。少なくとも、イマドキにハイパーヒューマンリーダブル非構造化テキストログはないかなぁ、といったところです。
スライドにしたら判別不能になったOWINのStartup部分も置いておきます、参考までに。
// 開発環境用Startup(本番では使わないミドルウェア/設定込み) public class Startup { public void Configuration(IAppBuilder app) { app = new ProfilingAppBuilder(app); // 内製Glimpse表示用AppBuilderラッパー(Middlewareトラッカー) app.EnableGlimpse(); // Glimpse.LightNdoe同梱ユーティリティ app.Use<GlobalLoggingMiddleware>(); // 内製ロギングミドルウェア app.Use<ShowErrorMiddleware>(); // 内製例外時表示ミドルウェア app.Map("/api", builder => { var option = new LightNodeOptions(AcceptVerbs.Get | AcceptVerbs.Post, new LightNode.Formatter.Jil.JilContentFormatter(), new LightNode.Formatter.Jil.GZipJilContentFormatter()) { OperationCoordinatorFactory = new GlimpseProfilingOperationCoordinatorFactory(), ErrorHandlingPolicy = ErrorHandlingPolicy.ThrowException, OperationMissingHandlingPolicy = OperationMissingHandlingPolicy.ThrowException, }; builder.UseLightNode(option); }); // Indexはデバッグ画面に回す app.MapWhen(x => x.Request.Path.Value == "/" || x.Request.Path.Value.StartsWith("/DebugMenu"), builder => { builder.UseFileServer(new FileServerOptions() { EnableDefaultFiles = true, EnableDirectoryBrowsing = false, FileSystem = new PhysicalFileSystem(@".\DebugMenu"), }); }); // それ以外は全部404 app.MapWhen(x => !x.Request.Path.Value.StartsWith("/Glimpse.axd", StringComparison.InvariantCultureIgnoreCase), builder => { builder.Run(ctx => { ctx.Response.StatusCode = 404; return Grani.Threading.TaskEx.Empty; }); }); } }
インデックスでアクセスすると表示するページはGlimpse.axdと、シングル全画面ページで表示できるローンチ部分へのリンクを貼っつけてあります。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Debug Index</title> </head> <body> APIのデバッグ<br /> <p> <a href="../../Glimpse.axd?n=glimpse_redirect_popup">Glimpse Launch</a> </p> <p> <a href="../../glimpse.axd">Glimpse Config</a> </p> </body> </html>
まぁ、こういうのあると、Glimpseへのアクセスが近くで非常に便利です。
あと最後に、OWINでやるならこーいうのどうでしょう、というWeb.config。Owin Middlewareと機能重複して鬱陶しいからHttpModule丸ごと消そうぜ、という過激派な案ですにゃ。
<?xml version="1.0" encoding="utf-8"?> <!-- OWIN向けウェブコン --> <!-- Glimpse系のはリリース時にはxsltでまるっと消す --> <configuration> <configSections> <section name="glimpse" type="Glimpse.Core.Configuration.Section, Glimpse.Core" /> </configSections> <connectionStrings configSource="<!-- 接続文字列は外部に回す(DebugとReleaseでxsltで変換して別参照見るように) -->" /> <appSettings> <!-- なんかここに書いたり外部ファイルとmergeしたり:) --> </appSettings> <system.web> <!-- system.web配下のは片っ端から消してしまう --> <httpModules> <clear /> <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" /> </httpModules> <httpHandlers> <clear /> <add path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" /> </httpHandlers> <roleManager> <providers> <clear /> </providers> </roleManager> <customErrors mode="Off" /> <trace enabled="false" /> <sessionState mode="Off" /> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters="" /> <globalization culture="ja-jp" uiCulture="ja-jp" /> <!-- リリース時にxsltでfalseにする --> <compilation debug="true" /> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <globalModules> <clear /> </globalModules> <modules> <!-- モジュールも全消し --> <remove name="OutputCache" /> <remove name="Session" /> <remove name="UrlRoutingModule-4.0" /> <!-- 以下デフォで読まれるモジュール名が延々と続く(system.webServer下は一括clearが使えなくて辛い)... --> <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" /> </modules> <handlers> <add name="Glimpse" path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" preCondition="integratedMode" /> </handlers> </system.webServer> <!-- おまじない(笑)セクション --> <system.net> <connectionManagement> <add address="*" maxconnection="1024" /> </connectionManagement> <settings> <servicePointManager expect100Continue="false" useNagleAlgorithm="false" /> </settings> </system.net> <!-- WebServiceでやるならPersistResultsで(当然このセクションもリリースでは消す) --> <glimpse defaultRuntimePolicy="PersistResults" endpointBaseUri="~/Glimpse.axd"> <tabs> <ignoredTypes> <add type="Glimpse.AspNet.Tab.Cache, Glimpse.AspNet" /> <add type="Glimpse.AspNet.Tab.Routes, Glimpse.AspNet" /> <add type="Glimpse.AspNet.Tab.Session, Glimpse.AspNet" /> <add type="Glimpse.Core.Tab.Trace, Glimpse.Core" /> </ignoredTypes> </tabs> <runtimePolicies> <ignoredTypes> <add type="Glimpse.Core.Policy.ControlCookiePolicy, Glimpse.Core" /> <add type="Glimpse.Core.Policy.StatusCodePolicy, Glimpse.Core" /> <add type="Glimpse.Core.Policy.AjaxPolicy, Glimpse.Core" /> <add type="Glimpse.AspNet.Policy.LocalPolicy, Glimpse.AspNet" /> <add type="Glimpse.Core.Tab.Trace, Glimpse.Core" /> </ignoredTypes> </runtimePolicies> </glimpse> </configuration>
Web API的なサービスでもGlimpse使えるよ!ってのはもっと知ってほしいかしらん。その辺はLightNode 1.0、或いはWeb APIでのGlimpseの使い方で詳しく解説しています。