seki-motoの日記 RSSフィード

2009-12-11 夜の冷え込みが厳しくなってきました

.NETでコントローラを作ってみる

Javaのframeworkである、Strutsに触る機会があり、調べモノをしていたらこんな情報を発見。

ASP.NET と Struts : Web アプリケーションのアーキテクチャ

そうそう。ASP.NETは、MVCになってるとはいえ、ページコントローラ(Page Controller)なんだよね。

Strutsの.NET版を作るわけではないけど、勉強がてらにコントローラから作ってみることに。


Visual Studio 2005 でプロジェクト作成

参考サイト

1.「ファイル」-「新しい Web サイト...」
2.「空の Web サイト」を選択し、言語や場所を適当に設定し「OK」

f:id:seki-moto:20091211220121j:image

3.ソリューション エクスプローラで、"App_Code"のフォルダを新規作成

f:id:seki-moto:20091211220120j:image

4."App_Code"の中にクラスを新規作成(Handler.cs にしました)

f:id:seki-moto:20091211220119j:image f:id:seki-moto:20091211220118j:image


自動生成された Handler.cs ファイル

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Handler の概要の説明です
/// </summary>
public class Handler
{
    public Handler()
    {
        //
        // TODO: コンストラクタ ロジックをここに追加します
        //
    }
}
5.ソースの書き換え

とりあえずこんな感じにしました。コメントアウトされているExceptionは、IHttpHandlerを実装したときに自動生成されたもの。

using System;
using System.Web;

/// <summary>
/// Handler の概要の説明です
/// </summary>
public class Handler : System.Web.IHttpHandler
{
    public Handler()
    {
        //
        // TODO: コンストラクタ ロジックをここに追加します
        //
    }

    #region IHttpHandler メンバ

    public bool IsReusable
    {
        // get { throw new Exception("The method or operation is not implemented."); }
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        // throw new Exception("The method or operation is not implemented.");
        context.Response.ContentType = "text/html";
        context.Response.Write("Hello World");
    }

    #endregion
}
6.「デバッグ」-「デバッグ開始」

デバッグが無効です」とメッセージが出るので、「新しい Web.config を追加してデバッグを有効にする」がチェック状態にして「OK」

f:id:seki-moto:20091211222357j:image

7.IEが開くので閉じる

とりあえずココまでは順調そう。ブラウザは閉じる。

f:id:seki-moto:20091211222356j:image

8.Web.Configの編集

<system.web> に <httpHandlers> を追加。

<add> の type には、ハンドラのクラス名を記述。今回は"Handler"。

とりあえず、こんな感じになりました。〜.do が呼ばれたら、ハンドラが動くことを期待。Strutsに影響されすぎ?

<?xml version="1.0"?>
<!-- 
    メモ: このファイルを手動で編集する代わりに、Web 管理ツールを使用 
    してアプリケーションの設定を構成することができます。Visual Studio 
    の [Web サイト] メニューにある [ASP.NET 構成] オプションから設定
    を行ってください。設定およびコマンドの一覧は、通常
    \Windows\Microsoft.Net\Framework\v2.x\Config にある
    machine.config.comments で確認できます。
-->
<configuration>
  <appSettings/>
  <connectionStrings/>
  <system.web>
    <!-- 
        デバッグ シンボルをコンパイルされたページに挿入するに
        は、compilation debug="true" に設定します。この設
        定はパフォーマンスに影響するため、開発時のみこの値
        を true に設定してください。
    -->
    <compilation debug="true"/>
    <!--
        <authentication> セクションは、ユーザーを識別するため
        に、ASP.NET で使用されるセキュリティ認証モードの構成
        を有効にします。
    -->
    <authentication mode="Windows"/>
    <!--
        <customErrors> セクションは、要求の実行中にハンドル
        されていないエラーが発生した場合の処理方法の構成を
        有効にします。具体的には、開発者が HTML エラー ペ
        ージをスタック トレースのエラーの代わりに表示するように構
        成することを可能にします。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
    -->
    <httpHandlers>
      <add verb="*" path="*.do" type="Handler"/>
    </httpHandlers>
  </system.web>
</configuration>
9.再びデバッグ

とりあえずブラウザが立ち上がるので、

f:id:seki-moto:20091211222356j:image

アドレス(URL)の後ろに hoge.do とか入力して、移動すると、

f:id:seki-moto:20091211223653j:image

出来ました〜


参考情報

トラックバック - http://d.hatena.ne.jp/seki-moto/20091211/httphandler
リンク元