酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

ASP.NET MVC 4で新規のプロジェクトを作成する

みつばたんにASP.NET MVCは取っつきにくいと言われて、前に「雑な短冊メーカー改め、雑じゃない「短冊メーカー」を作りました - 酢ろぐ!」で書いたように今の自分のスキルでWebアプリを超高速開発できるのはASP.NET MVCかなと思っているので「そうかな?」と言ったけど、確かにお作法を知らないと何をして良いのか分からないだろうなぁ……と考え直した。

本記事では、Visual Studio 2013を使用して、新規作成したASP.NET MVCプロジェクトでコントローラーとビューを追加する方法をご紹介します。

ASP.NET MVCのプロジェクトを作成する

まずはVisual Studioを起動して、プロジェクトの新規作成をおこないます。テンプレートの一覧から「ASP.NET MVC 4 Web アプリケーション」を選択して、[OK]ボタンをクリックします。

f:id:ch3cooh393:20140715122312p:plain

[新しいASP.NET MVC 4プロジェクトダイアログ]が表示されるので、基本を選択して、[OK]ボタンをクリックします。少し待つとプロジェクトの自動生成が完了します。

f:id:ch3cooh393:20140715122320p:plain

実行するがエラーが発生してしまう→何故なのか

さて、テンプレートを使ってプロジェクトが生成できました。実行してみましょうか。開発中のプロジェクトを実行するには、F5キー押下もしくは下図の実行ボタンをクリックします。

f:id:ch3cooh393:20140715123131p:plain

テンプレから作成したんだから実行できると思いますよね?残念ながら実行できません。

下図のようなエラーページが表示されます。

f:id:ch3cooh393:20140715123138p:plain

何故なら、基本のテンプレートでASP.NET MVC 4プロジェクトを生成すると、デフォルトで開くコントローラーが存在していないからです。

ここで書いているデフォルトとは、例えば短冊メーカーの場合は、http://tanzaku.ch3cooh.jp/で開かれるページを指します。

作成されたプロジェクトの一覧をソリューションエクスプローラーで見てみましょう。沢山フォルダがあるのも困難の原因かもしれませんね。本記事では各フォルダについて紹介しませんので、ぐぐるなどして調べましょう。

f:id:ch3cooh393:20140715122346p:plain

前述したデフォルトで開くコントローラーとは何を指すでしょうか。

App_StartフォルダのRouteConfig.csを開いてみましょう。以下のようなコードがあります。デフォルトではHomeコントローラーIndexアクションが実行されることが分かります。

using System.Web.Mvc;
using System.Web.Routing;

namespace Test1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

コントローラーとビューを追加する

ソリューションエクスプローラーのControllersフォルダを右クリックして、コンテキストメニューから[追加]、[コントローラー]の順に選択します。

f:id:ch3cooh393:20140715122725p:plain

コントローラー名をHomeControllerにします。テンプレートは空のMVCコントローラーとします。ダイアログ右下の[追加]ボタンをクリックしてください。

f:id:ch3cooh393:20140715122750p:plain

Controllersフォルダの直下にHomeController.csが生成されます。Indexメソッドでは単にViewを返しています。単純にView()を返した場合には、Viewsフォルダ配下のHome/Index.cshtmlを返します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Test1.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

    }
}

Viewsフォルダの配下にHomeフォルダを堀ります。

f:id:ch3cooh393:20140715122806p:plain

次にビューの追加を行います。

f:id:ch3cooh393:20140715124632p:plain

[ビューの追加ダイアログ]が表示されます。ビュー名の欄にIndexと入力します。ビューエンジンにはRazor (CSHTML)を選択します。

f:id:ch3cooh393:20140715122813p:plain

Index.cshtmlファイルが追加されると思います。テキスト部分を以下のコードのように書き換えてみました。

@{
    ViewBag.Title = "テストページのタイトル";
}

<h2>タイトル入れるところ</h2>

さて、実行してみましょう。IEが起動し、下図のようにページが表示されるようになりました。

f:id:ch3cooh393:20140715122822p:plain

Azure Webサイトでサブディレクトリに配置したアプリをサブドメイン形式でアクセスできるようにする

短冊メーカーやテスト用に作った諸々のプロジェクトをデプロイするのに、Webサイトの無料枠を使うのが勿体ないと思いました。「tanzaku.azurewebsites.net」や「cit.azurewebsites.net」は、それぞれ個別にWebサイトの無料モードを使っているわけなのですが、例えば「example.azurewebsites.net/tanzaku」のようにサブディレクトリに配置して、「tanzaku.ch3cooh.jp」でアクセスできるようにはならないかな…と考えました。

Azure Webサイトの解説でよく名前があがる「Kudu」とは何か

Kuduは、Azure Webサイトの「Gitデプロイエンジン」らしいです。国内でkuduの情報を調べたら「しばやん雑記」に行きつくと思います。

そのしばやん雑記で紹介されていたのが以下の記事です。

IISマネージャーからAzure Webサイトへ接続する

まずは「IIS Manager for Remote Administration 1.2」をインストールします。誤って異なるバージョンのIISマネージャーをインストールしてしまうとWebサイトへのアクセスはできません。

IISマネージャーから、URL Rewriteの設定をおこなうことが可能です。Azure Webサイトへ接続しましょう。いつもアクセスしているtanzaku.azurewebsites.netではないことに注意します。

IISマネージャーのツールバーから[ファイル]、[サイトに接続...]の順に選択します。

f:id:ch3cooh393:20140714174816p:plain

サイトに接続するための情報を入力します。下記の接続情報は、tanzaku.azurewebsites.netにアクセスするための情報です。別のインスタンスで試す場合にはそれぞれtanzakuの部分を読みかえてください。

  • サーバー名
    • tanzaku.scm.azurewebsites.net:443
  • サイト名
    • tanzaku

f:id:ch3cooh393:20140714175009p:plain

ユーザー名とパスワードを入力します。ユーザー名は先頭に$がつきます。パスワードは発行プロファイルをテキストエディタ等で開くと書かれています。

  • サーバー名
    • $tanzaku
  • パスワード
    • <PASSWORD>

f:id:ch3cooh393:20140714175013p:plain

最後に接続の名前を入力します。これはどんな名前を付けても構いませんが、分かりやすい名前にしておいた方が良いと思います。

f:id:ch3cooh393:20140714175020p:plain

Azure Webサイトのサブディレクトリにアプリを配置する

サブディレクトリにアプリを配置(デプロイ)する方法です。xin9leさんの以下の記事が参考になります。

この記事を参考にしながら、tanzaku.azurewebsites.netに配置していたアプリをexample.azurewebsites.net/tanzakuにも配置します。

URL Rewriteの設定をおこなう

Webサイトへ接続できるようになりましたのでURL Rewriteの設定をおこないます。既にDNSの設定でtanzaku.ch3cooh.jpexample.azurewebsites.netに割り振られていることを前提とします。

少し縦長画像なので2つに分割しています。下図の設定では、tanzaku.ch3cooh.jpにアクセスされた場合に、example.azurewebsites.net/tanzakuをアクセスする設定です。

f:id:ch3cooh393:20140715112923p:plain

f:id:ch3cooh393:20140715112933p:plain

以上でhttp://tanzaku.ch3cooh.jp/でアクセスできるようになりました。

この記事だけ読んで設定できるとは思えないので、それぞれ参照した記事をメモしているので、そちらをお読みください。おわり。

雑な短冊メーカー改め、雑じゃない「短冊メーカー」を作りました

ASP.NET MVCとAzure Webサイトを使えば、Webアプリを思いつきでささっと作って動くものが作れるのが楽しい。htmlが書けない僕でも、Bootstrapを使えば最低限の見栄えのものが作れるのも楽しいポイントのひとつですね!

ということで、改めて短冊メーカーを作成しました。

  • 短冊メーカー (Microsoft Azureが自由に使えなくなったので閉鎖しました)

先日書いた「ASP.NET MVC 4でjQueryを使って動的に部分ビューを更新させる - 酢ろぐ!」を見て、短冊メーカーを作ってくれた方がいたので先に紹介しておきますね。

もう7月11日ですが、7月7日に公開した雑な「短冊メーカー」をアップデートしたのでご報告です。

肝心のアップデート内容ですが、「アルパカ」と「ねこ」という新しいテンプレに対応させたほかは、縦書き変換時の問題を少し解決してます。

  • アルパカテンプレをサポート
  • ねこテンプレをサポート
  • カッコ文字を縦書きカッコ文字へ変換対応
  • 半角英数字を全角英数字へ変換対応
  • 半角カナを全角カナへ変換対応
  • サロゲートプロ文字(絵文字や𩹉問題)対応

PCで見た際のサイトの表示も2ペインにして、サイドバーにTwitter検索の結果を表示させているなど、見た目も少し改善しています。それでもBootstrapで作りましたっ!って枠を超えないのはお察し。もうちょっとカスタマイズできればいいんだけど、それはまた暇ができた時にでも。

短冊

シンプルな短冊メーカーです。7月7日に公開したものとあまり違いません。

┏┷┓
┃ ┃
┃雑┃
┃な┃
┃短┃
┃冊┃
┃ ┃
╰̚━┛⁾⁾

アルパカ

アルパカ風の短冊メーカーです。願いごとが長ければ長いほどアルパカの首が伸びていきます。

.
 ∩_∩
(゚ω゚ ) アルパカ
 │ │
 │雑│
 │な│
 │短│
 │冊│
 │ └─┐○
 ヽ   丿
  ∥ ̄∥

ねこ

ねこ風の短冊メーカーです。願いごとが長ければ長いほどねこの胴体が伸びていきます。

.
A____A
|・ㅅ・| 
|っ c| 
|   | 
| 雑 | 
| な | 
| 短 | 
| 冊 | 
|   |
U ̄ ̄U

ようかん

ようかんマン風の短冊メーカーです。願いごとが長ければ長いほどようかんマンの胴体が伸びていきます。

.
 .__
ヽ|・∀・|ノ
 |   |
 | 雑 |
 | な |
 | 短 |
 | 冊 |
 |___|
  | |

検索ボックス

検索ボックス風の短冊メーカーです。願いごとが長ければ長いほど検索ボックスの横幅が伸びていきます。もはや短冊とは何かと考えさせられる問題作です。

.
┌──────┬──┐ 
│ 雑な短冊 │検索│
└──────┴──┘ 

数々のフィードバック

だるさんのツイートを見てから思いつきで作った短冊メーカーだったので、短冊を作る肝心な処理はLINQ1行だけのお手軽な実装でした。

それだけだと多くの文字に対応しきれずに短冊を表示したときに文字化けであったり、短冊が崩れてしまうという現象が発生していました。そして、容赦ない崩れた短冊ツイート!!ユーザーによるデバッグをしてもらった感じ*1です。

雑な短冊メーカーだから勘弁してよ……と思っていた(言ってた)のですが、ストア経由のネイティブアプリと異なり修正したら1クリックでペペ〜んとデプロイ(公開)できるので、みんなの様子を見ながら指摘された内容を反映させていきました。おかげで作った時よりもデバッグ作業に工数掛かってるねんで……

アップデート一覧でも書いた通り、縦書き変換時の不具合は一通り解決していると思っているので、何か問題があればコメントを書くか、Twitterで🍥を投げてください。分かる範囲で対応します。

それでは、素敵な短冊ライフを!🎋

*1:ちゃんとテストコード書けと怒られる。でも雑な短冊メーカーって言ったじゃないか!

ASP.NET MVC 4でjQueryのタイマーを使って定期的に部分ビューを更新する

ASP.NET MVCで、タイマーを使って処理させるのか実現するためには、どうしたら良いのかメモしながら調べています。

_Layout.cshtml

これはわざわざ書く必要はないと思いますが、jQueryのjsを読み込みをしています。ASP.NET MVC 4のテンプレートに付属のjQueryのバージョンは1.8.2です。最新は2.1.1らしい。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>タイマーのテスト</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <meta charset="utf-8" />
        <script src="~/Scripts/jquery-1.8.2.min.js"></script>
    </head>
    <body>
        @RenderBody()
    </body>
</html>

Views/Home/Index.cshtml

3,000ミリ秒(3秒)に1回、idupdatePaneを対象にして、HomeコントローラーのTimeアクションを実行します。

<div id="updatePane">
    @Html.Action("Time")
</div>

<script type="text/javascript">
    $(function () {
        $.ajaxSetup({ cache: false });
        setInterval(
            function () { $("#updatePane").load("Home/Time"); }
            , 3000);
    });
</script> 

Views/Home/Time.cshtml

Time.cshtmlは呼び出しされた現在時刻を返します。C#を使ったことがある方なら分かると思いますが、DateTime.Nowプロパティを取れば現在時刻が得られます。

部分ビューを返します。

<h1>@DateTime.Now</h1>

Controllers/HomeController.cs

ほとんど何も実装していませんが、Homeコントローラーは下記の通りです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Tanzaku.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Time()
        {
            return PartialView();
        }
    }
}

Microsoft Azure Webサイトの○○.azurewebsites.netからカスタムドメインへリダイレクトさせる

AWS Route 53を使ってMicrosoft Azure Webサイトでwwwなしのカスタムドメインを設定する - 酢ろぐ!」にて、Azure Webサイトでカスタムドメインを使う方法を紹介しました。Googleさんはかなり優秀で既に検索結果に反映され始めています。もう1,000件を超えてる!

f:id:ch3cooh393:20140530081638p:plain

しかし、Googleさんは優秀すぎるのか設定しているカスタムドメインだけではなく、既定のドメインである「○○.azurewebsites.net」の方もインデックスされてしまっています。

f:id:ch3cooh393:20140530081645p:plain

少し困った状況になりました。

○○.azurewebsites.netからカスタムドメインへリダイレクトさせる

既定のドメインとカスタムドメインの設定は以下のようになっているとします。必要に応じてドメイン部分を読み変えてください。

  • Webサイトでの既定のドメイン
    • catchball.azurewebsites.net
  • 設定したいカスタムドメイン
    • catchball.co

Web.configを開き、system.webServer要素にrewrite要素を追加します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- ~省略~ -->
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="catchball.azurewebsites.net" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^catchball\.azurewebsites\.net$" />
                    </conditions>
                    <action type="Redirect" url="http://catchball.co/{R:1}" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <!-- ~省略~ -->
</configuration>

こうすることで、例えば http://catchball.azurewebsites.net/news/ にアクセスされても、適切に http://catchball.co/news/ へ301リダイレクトしてくれます。

Googleは、301リダイレクトを受けるとサイトを引っ越したと認識して、検索結果への反映してくれます。既にGoogleに○○.azurewebsites.netドメインで登録されているいくつかのURLもしばらくするとcatchball.coへ置き換わってくれるでしょう。

参考記事

blog.shibayan.jp

AWS Route 53を使ってMicrosoft Azure Webサイトでwwwなしのカスタムドメインを設定する

Microsoft Azure Webサイトは、PaaSでサーバーのことをあまり考えなくて良いこともあって重宝しています。Visual Studioでコードを書いて、デプロイ(発行)するまで2クリックでできるので、パパッと書いて挙動を確かめるのにとても便利です。

Azure Webサイトはデフォルトのままだと、「○○.azurewebsites.net」という既定のドメインになります。プログラミング生放送のサイトですと下記のように○○の部分が「pronama」になっているのが分かります。

Googleで「site:azurewebsites.net」で検索すると、約1,240,000件引っかかりますので、既定のドメインのまま運用されている方も結構いるようです。

www無しのカスタムドメインを設定する

さて、本題です。

最近、過去に書いたようにASP.NET MVCを勉強しながら毎日チマチマと弄ってるサービスがあります。

野球ニュースを集めてきてその日ごとに表示させる「CatchBall」というサイトなのですが、せっかく作ったサイトなので独自のドメインを使いたいと考えています。

あとは、個人的にドメインの頭にwwwが付いているのはあまり好きではないのでネイキッドドメイン(www無しのドメイン)として登録したいと思います。

  • Webサイトでの既定のドメイン
    • catchball.azurewebsites.net
  • 設定したいカスタムドメイン
    • catchball.co

Webホスティングプランのモードについて

Webサイトでは、カスタムドメインを使うためにはWebホスティングプランのモードを「共有」以上にする必要があります。「無料」ではカスタムドメインを設定することはできません。

Webホスティングプランのモードは、Azureポータルでサイトを表示して「スケール」タブに表示されています。僕は、下図の通りカスタムドメインを扱える中でも最も安い「共有」モードをよく使っています。

f:id:ch3cooh393:20140527182740p:plain

Microsoft Azure Webサイトでカスタムドメインを設定するには「構成」タブを開いて、「ドメイン名」の項目を見てみましょう。現在の設定ですと、このWebサイトにアクセスするには既定のドメイン経由でアクセスするしかありません。

f:id:ch3cooh393:20140528094322p:plain

カスタムドメインを設定するためには、緑色の「ドメインの管理」ボタンをクリックします。カスタムドメイン管理用のポップアップが表示されます。

f:id:ch3cooh393:20140528093559p:plain

カスタムドメインを使用するための方法が、公式のヘルプでは以下のように書かれています。

カスタム ドメインを管理する

カスタム ドメイン名で Windows Azure の Web サイトを参照できます。Windows Azure は、Windows Azure の Web サイトを参照するようにドメイン名を構成できることを確認する必要があります。承認を確認するには、www.yourdomain.com から example.azurewebsites.net、または awverify.www.yourdomain.com から awverify.example.azurewebsites.net を参照する DNS プロバイダーで CNAME リソース レコードを作成してください。 トラフィック マネージャーを使用する場合は、*.trafficmanager.net URL を参照する DNS プロバイダーで CNAME リソース レコードを作成してください。

ずらずらーと書かれていて、最初読んだ時には僕にはちんぷんかんぷんでした。ザックリと分類すると、カスタムドメインを使ってWebサイトにアクセスするためには下記の2つの方法があります。

  1. CNAMEを使う
  2. Aレコードを指定する

Aレコードを使って指定するので、先ほどのポップアップの下部に「Aレコードの構成時に使用するIPアドレス」がありますのでメモっておきましょう。

AWS Route 53でのDNS設定

次はAWS Route 53でDNS情報の設定をおこないます。

DNS情報の管理には、Amazon Web Servicesの「Route 53」を使っている方が沢山いるのではないでしょうか。僕も使っています。Route 53ではネイキッドドメインでCNAMEを指定できませんので、1の方法は使えず、2の方法を採用することになります。

「example.azurewebsites.net」を「catchball.co」というドメインで見たい場合には、AWS Route 53で下図のように指定します。

f:id:ch3cooh393:20140528093540p:plain

画像だと見にくいかもしれませんので、表を書いておきますのでご参照ください。「awverify.catchball.azurewebsites.net」のcatchball部分は、Azure Webサイトを作成した際のサブドメイン部分になります。自分で登録したサブドメインの名前に適切に読みかえてください。

名前 種類
catchball.co. A 138...***<先ほどのAレコード用IPアドレス>
awverify.catchball.co. CNAME awverify.catchball.azurewebsites.net.

Azure側で変更したDNS情報が認識できれば、次のステップに進むことができます。計測したことはありませんが、Azure側のキャッシュ更新は結構早かったと思います。

Azure Webサイト側でカスタムドメインの設定

Azure側に戻ってきましょう。「構成」タブの「ドメイン名」項目のドメインの管理ボタンをクリックして、カスタムドメインの設定をおこないます。

テキストボックスに「catchball.co」と入力するとプログレスインジゲータが回り始めます。DNS情報に問題がなければ、ポップアップの右下のチェックボタンをクリックして、カスタムドメインの設定は完了です。

f:id:ch3cooh393:20140528100149p:plain

既定のドメインしか表示されていなかったリストに独自ドメインが追加されているはずです。

f:id:ch3cooh393:20140528100233p:plain

これで「catchball.co」で「catchball.azurewebsites.net」にアクセスできるようになります。

Microsoft Azure Webサイトで新しいサイトを作成する

本記事ではMicrosoft AzureでWebサイトを作る方法を紹介します。

Microsoftアカウントは作成済みで、Microsoft Azureを使うための諸々の手続きは環境しているものとします。

下記のアドレスからAzureのメインページへアクセスします。

ページのヘッダー部分に「ポータル」と書かれたリンクがあるのでクリックします。

f:id:ch3cooh393:20140527110502p:plain

取得済みのMicrosoftアカウントでサインインします。

f:id:ch3cooh393:20140527110452p:plain

サインインすると、Microsoft Azureポータルへ遷移して、過去に作成したアイテムの一覧が表示されます、新しくWebサイトを作成するにはページのフッター部分にある「新規」ボタンをクリックします。

f:id:ch3cooh393:20140527112658p:plain

ポチポチ選択するだけでアイテムが作成できるウィザードが表示されます。 「コンピューティング」の中から「WEBサイト」をクリックします。

f:id:ch3cooh393:20140527112709p:plain

「WEBサイト」の中から「簡易作成」をクリックします。WordPressなどのパッケージをインストールした状態のWebサイトを作成したい場合は「ギャラリーから」を選択すると良いでしょう。

f:id:ch3cooh393:20140527112717p:plain

「簡易作成」をクリックすると、○○.azurewebsites.netの○○にあたるサブドメインを入力して、Webホスティングプラン*1を選択します。リージョンは「日本(西)」を選択しました。

3つのテキストボックスに入力が完了したら、②で指している「WEBサイトの作成」をクリックします。

f:id:ch3cooh393:20140527112754p:plain

緑いろのバーがムニョムニョ動き出します。(長めにみて)1分くらいでWebサイトの作成が完了します。

f:id:ch3cooh393:20140527112808p:plain

以上がMicrosoft AzureでWebサイトを作る方法でした。

*1:Webサイトのインスタンスをグループ分けするものと理解しています