2013年11月11日

OWINとNancyとRazorのサイトで多言語化。

一日に何度も更新しなくても。

何度も更新しなくても、とも思うんですが。
まあ、そういう日もあるんじゃね、ってことで。

多言語化です。

好きです。
多言語化ネタ。
そういえば昔もQtとかでアプリを作った時もひたすら多言語化を考えてた気がする。

というわけで、先のOWINとNancyとRazorの記事の続きなのですが。
実はあまり書くことはなかったりします。
それは、以前に書いたMVC4の多言語化の方法とほとんど同じなので。
すみませんが、そちらの記事を参考にしてください。

間違えていました!!(2013/11/12)

追試を行った結果、記述を間違えていたことが判明しました。
申し訳ありません。

以下、修正し直してあります。

WebRoleにOWINでNancyでRazorしてみる。

Surface Pro欲しいです。

いいですよね。
Surface。
テスト機用にSurface2は仕事場にあって、その速さは実感済みなんですけど。
Surface Pro欲しいですよ。
個人的に。

SignalRを使おうとしてみた。

SignalRを使おうとしてみたのですが、何やらOWINに移行済みとか。
んで、OWINって何ぞや?とかやってみたんですが、まあ資料の少ないことw
しばやんさんのページにはホント助けられました。
そのほかにも、いろんなところでも。

それで、OWIN調べると、いろいろ嵌る嵌る。
日本語の資料が少ないのもあるんですが。
折角なので、忘備録的に書いておこうと思いまして。

手順。

ざっと手順としては、以下になります。

  1. WebRoleのプロジェクトを作る
  2. パッケージをインストールする
  3. web.configを手直しする
  4. OWINのStartupを作る
  5. NancyのModuleを作る
  6. Razorのビューを作る

それぞれはホントにちょこちょこっと入力するだけなので、理解してしまえばHello Worldをデプロイするまで30分くらいです。

プロジェクトを作る。

ここで試した環境は、Windows8 + Visual Studio 2013です。
まあ、Visual Studio 2013 Web版でも大丈夫っぽいです。

まずは普通にCloudのプロジェクトを作ってWebRoleを追加しておきます。
その際、WebRoleはEmptyで作っておきます。
また、参照でMVCにチェックを入れておくと、後々Razorのビューを作るときにIntelisenceが効きます。

01

パッケージをインストールする。

以下の3つのパッケージをインストールします。

Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Nancy.Owin
Install-Package Nancy.Viewengines.Razor

web.configを手直しする。

以下の真ん中の行を追加しておきます。
<appSettings>
  <add key="owin:HandleAllRequests" value="true"/>
</appSettings>

また、以下の行が2重化しているので1つ削除しておきます。

<add key="webPages:Enabled" value="false" />

OWINのStartupを作る。


パッケージをインストールすると、「追加」→「新しい項目」の一覧の中に「OWIN Startupクラス」というのが増えています。
これを使ってStartupクラスを作成します。


02


Nancyのモジュールを作る。


Nancyでルーティングテーブルを作成するためにモジュールを作成します。
これは、MVCのControllerと同じようなもので、命名規則も似通っています。
クラス名はxxxModuleとして、xxxの部分を好きな名前に変えてください。


public class HomeModule : NancyModule
{
     public HomeModule()
     {
         Get["/"] = _ =>
         {
             ViewBag.Title = "Razor Page";
             return View["index"];
         };
     }
}

View[]の中がRazorのビューのファイル名になります。
また、MVCで使うときとと同じようにViewBagが使えます。


Razorのビューを作る。


プロジェクトを作るときにMVCにチェックを入れておくと、基本的なディレクトリが作成されています。
RazorのビューはMVCで使うのと同じようにViewsディレクトリに作ります。


03


Nancyのモジュールを作った際につけたクラス名xxxModuleのxxxの部分がViewsディレクトリの下に、そしてその下に拡張子.cshtmlを補う形でビューのファイルを作成します。
ビューのファイルは以下のようになります。

@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>

@{     Layout = "Shared/_Layout.cshtml";
}

<h3>Hello, world</h3>

基本的にはMVCの時と変わらないのですが、1行目にクラス情報を書きます。
細かく言うと、ビューファイルはC#のファイルを生成し、それをコンパイルすることで動きます。
1行目はその基底クラスの宣言になるようです。
(正確には@inheritsの行)


また、<>の中はNancyのモジュールでView[]を使用した際に2番目の引数の型になります。
この辺は気が向いたらまた書くかもしれません。


Layoutを使う際には、Viewsの下からのディレクトリ・ファイル名を書きます。
ここはMVC5のRazor用にビューを作ると、”~/Views/Shared/_Layout.cshtml”の様にパスが書かれてあります。
このままではNullPointerExceptionが出ますので気を付けてください。


以上でF5とか押してデバッグをするとHello, Worldが出ます。


Azureにデプロイする際の注意点。


このままAzureにデプロイすると、エラーになります。
それは、参照ファイルが足りないから。
「参照の追加」から、「アセンブリ」「拡張」ときて、Microsoft.Web.Infrastructureを追加して、「プロパティ」からローカルコピーをTrueに変えておいてください。


とりあえず。


本当はSignalRをやってみたいんですが、調べていくうちになんとなくこんな方向に行ってしまいました。
実はその前に



  1. OWINって何ぞや
  2. NancyってNode.jsのExpress.jsっぽ
  3. OWINが発展してEdge.jsとな
  4. おおお。Node.jsでC#のコード呼び出せるのか
  5. VSのプロジェクトにするかPowerShellで作ったものを使うか…
  6. Node.jsのVSのプロジェクトめんどい
  7. じゃ、MVCでいいじゃん
  8. SignalR…OWIN… ←イマココ

的な葛藤が。
次はNancyで行くかWebApiにするかで悩みそう。