グラニのC#フレームワークの過去と未来、現代的なASP.NETライブラリの選び方
- 2015-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の使い方で詳しく解説しています。