SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Monoでのプログラミング実例集

ASP.NET MVC on Mono
――「NerdDinner」をLinux上で動かしてみる

Mono環境でASP.NET MVCの動作確認を行う

  • X ポスト
  • このエントリーをはてなブックマークに追加

4. チュートリアルアプリケーション「NerdDinner」を実行する前に

 NerdDinnerを動かす前に、素のASP.NET MVCプロジェクトでの動作確認を行います。

 Visual Web Developer 2008 Express editionで作成したASP.NET MVCプロジェクト用ソリューションをMonoDevelopから開き、プロジェクトのビルドおよび実行が可能です。Monoから提供されているxsp2簡易Webサーバが起動し、デフォルトブラウザに設定されているブラウザが起動します。

MonoDevelopから実行
MonoDevelopから実行

 ここで確認しておきたいのは、標準の認証機能およびUnit Testプロジェクトの実行です。

認証機能

 認証にMembershipを使用していますが、Mono環境では次の既存の設定により、標準のMembershipプロバイダとしてSQLite DBにユーザ情報を格納するSqliteMembershipProviderを使用するようになっています。

「/opt/mono/2.4.2.3/etc/mono/2.0/settings.map」から抜粋
<?xml version="1.0" encoding="utf-8" ?>
<settingsMap>
  <map sectionType="System.Web.Configuration.MembershipSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
       mapperType="Mono.Web.Util.MembershipSectionMapper, Mono.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"
       platform="Unix">

    <!-- The 'what' tag specifies which region of the section to modify. The 'value' attribute value is mapper-specific and is not defined here. It can be
         any expression understood by the mapper to designate the section region to modify.
    -->
    <what value="providers">
      <!-- 'what' can contain any number of occurrences of any three elements:
              replace - replace the designated region
          add - add a new entry to the region
          clear - clear the region
          remove - remove the designatedregion

              The attributes to any of the above are freeform and are not processed by the mapper manager. They are stored verbatim for the
          mapper to peruse.
      -->
      <replace name="AspNetSqlMembershipProvider" 
type="System.Web.Security.SqliteMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqliteServer" />
</what> </map> ... <settingsMap>
「/opt/mono/2.4.2.3/etc/mono/2.0/machine.config」から抜粋
<connectionStrings>
    <add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
    <add name="LocalSqliteServer" connectionString="Data Source=|DataDirectory|/aspnetdb.sqlite;version=3" providerName="Mono.Data.Sqlite"/>
</connectionStrings>

 これらの設定によりSqlMembershipProviderからSqliteMembershipProviderを使用するようになり、Membership用のSQLite DBが必要になります。

 Membership用のSQLite DBについては、「Linq to SQL on Mono Update: NerdDinner on Mono」に記述があり、それを抜粋すると次のSQLデータ定義文を実行することで生成できます。

「aspnetdb.sql」
-- sqlite3 aspnetdb.sqlite < aspnetdb.sql
--
--
CREATE TABLE Users (
    pId                                     character(36)           NOT NULL,
    Username                                character varying(255)  NOT NULL,
    ApplicationName                         character varying(255)  NOT NULL,
    Email                                   character varying(128)  NOT NULL,
    Comment                                 character varying(128)  NULL,
    Password                                character varying(255)  NOT NULL,
    PasswordQuestion                        character varying(255)  NULL,
    PasswordAnswer                          character varying(255)  NULL,
    IsApproved                              boolean                 NULL, 
    LastActivityDate                        timestamptz             NULL,
    LastLoginDate                           timestamptz             NULL,
    LastPasswordChangedDate                 timestamptz             NULL,
    CreationDate                            timestamptz             NULL, 
    IsOnLine                                boolean                 NULL,
    IsLockedOut                             boolean                 NULL,
    LastLockedOutDate                       timestamptz             NULL,
    FailedPasswordAttemptCount              integer                 NULL,
    FailedPasswordAttemptWindowStart        timestamptz             NULL,
    FailedPasswordAnswerAttemptCount        integer                 NULL,
    FailedPasswordAnswerAttemptWindowStart  timestamptz             NULL,
    CONSTRAINT users_pkey PRIMARY KEY (pId),
    CONSTRAINT users_username_application_unique UNIQUE (Username, ApplicationName)
);

CREATE INDEX users_email_index ON Users (Email);
CREATE INDEX users_islockedout_index ON Users (IsLockedOut);

CREATE TABLE Roles (
    Rolename                                character varying(255)  NOT NULL,
    ApplicationName                         character varying(255)  NOT NULL,
    CONSTRAINT roles_pkey PRIMARY KEY (Rolename, ApplicationName)
);

CREATE TABLE UsersInRoles (
    Username                                character varying(255)  NOT NULL,
    Rolename                                character varying(255)  NOT NULL,
    ApplicationName                         character varying(255)  NOT NULL,
    CONSTRAINT usersinroles_pkey PRIMARY KEY (Username, Rolename, ApplicationName),
    CONSTRAINT usersinroles_username_fkey FOREIGN KEY (Username, ApplicationName) REFERENCES Users (Username, ApplicationName) ON DELETE CASCADE,
    CONSTRAINT usersinroles_rolename_fkey FOREIGN KEY (Rolename, ApplicationName) REFERENCES Roles (Rolename, ApplicationName) ON DELETE CASCADE
);

CREATE TABLE Profiles (
    pId                                     character(36)           NOT NULL,
    Username                                character varying(255)  NOT NULL,
    ApplicationName                         character varying(255)  NOT NULL,
    IsAnonymous                             boolean                 NULL,
    LastActivityDate                        timestamptz             NULL,
    LastUpdatedDate                         timestamptz             NULL,
    CONSTRAINT profiles_pkey PRIMARY KEY (pId),
    CONSTRAINT profiles_username_application_unique UNIQUE (Username, ApplicationName),
    CONSTRAINT profiles_username_fkey FOREIGN KEY (Username, ApplicationName) REFERENCES Users (Username, ApplicationName) ON DELETE CASCADE
);

CREATE INDEX profiles_isanonymous_index ON Profiles (IsAnonymous);

CREATE TABLE ProfileData (
    pId                                     character(36)           NOT NULL,
    Profile                                 character(36)           NOT NULL,
    Name                                    character varying(255)  NOT NULL,
    ValueString                             text                    NULL,
    ValueBinary                             bytea                   NULL,
    CONSTRAINT profiledata_pkey PRIMARY KEY (pId),
    CONSTRAINT profiledata_profile_name_unique UNIQUE (Profile, Name),
    CONSTRAINT profiledata_profile_fkey FOREIGN KEY (Profile) REFERENCES Profiles (pId) ON DELETE CASCADE
);

 作成した「aspnetdb.sqlite」ファイルを「プロジェクトルート/App_Data」ディレクトリへ配置します。

 また、認証パスワードの暗号/復号化のための永続的なキーを保持するために、「プロジェクトルート/Web.config」にmachineKeyの設定が必要になります。

「プロジェクトルート/Web.config」から抜粋、machineKeyの設定
<system.web>
  <machineKey validationKey="A8A175A34D8CD7F6600DC9B5E5AA19F6793D18677AEE8D08171B1C6E9DB1678CDA3BC8D447B743A76EED18FEE0C419472E44C461C6B15E769DBBCE54EF3C24E8"
    decryptionKey="1ED97239F02ABF52B09DDA20F2FD983EE8F119AB512FD479" validation="SHA1" />
  ...
</system.web>

 machineKeyの生成には、ASP.NET Resourcesの<machineKey> Generaterなどを利用すればよいでしょう。

 詳細については、「Guide: Porting ASP.NET Applications」を参照して下さい。

 上記の設定後、MonoDevelopからASP.NET MVCプロジェクトを実行して、認証機能を確認できます。

認証済
認証済

 NerdDinnerもこの認証機能を使用しており、Membership用のSQLite DBおよび同様の設定が必要になります。

Unit Test

 NUnit Test Project Templatesをインストールしておくと、ASP.NET MVCプロジェクトを作成する時、同時にNUnit Testプロジェクトも作成できます(インストール方法については「VWD Express + ASP.NET MVC + NUnit Support」で簡単にまとめましたので参考にして下さい)。

NUnit Testプロジェクト作成の選択
NUnit Testプロジェクト作成の選択

 Mono 2.4.2.3ではNUnit 2.4.8が標準で組み込まれており、MonoDevelopからNUnit Testプロジェクトの単体テストが実行可能です(メニュー[ビュー]-[単体テスト]を選択)。

MonoDevelopからNUnit単体テスト実行
MonoDevelopからNUnit単体テスト実行

 NerdDinnerに含まれるUnit Testプロジェクトは、Visual Studio Team Systemテストツールを使用して作成されていますが、機械的な修正で、NUnit Testプロジェクトとして単体テストが実行可能になります。

次のページ
5. 「NerdDinner」を動かしてみる

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Monoでのプログラミング実例集連載記事一覧
この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4669 2010/01/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング