Archive - 2015.03

グラニのC#フレームワークの過去と未来、現代的なASP.NETライブラリの選び方

Build Insider MEETUP with Graniというイベントで、グラニのC#フレームワーク(というほどのものはない!)の今までとこれからってのを話しました。

A framework for light up applications of grani from Yoshifumi Kawai

そのうちBuild Insiderで文字起こしとか公開されると思います。

2015年の今、どういうライブラリを選んだか、とかNLog大脱却、とかって話が見どころですかね。うちの考えるモダンなやり方、みたいな感じです。

実際、EventSourceSemantic 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の使い方で詳しく解説しています。

Search/Archive

Category

Profile


Yoshifumi Kawai
Microsoft MVP for Visual Studio and Development Technologies(C#)

April 2011
|
July 2018

Twitter:@neuecc
GitHub:neuecc
ils@neue.cc