喜帳面の日記

50歳越えおやじのASP.NET MVC への挑戦日記です。

Visual Studio Express 2012 for Web でいってみる 18.Web の発行 ExpressWeb

さて、今回はサーバーへの公開にチャレンジしてみました。

初心者が行き当たりばったりにいろいろ動かしてみたときのメモなので記載内容には勝手な解釈や誤りもあるかと思います。そのあたりのご指摘よろしくお願いします。

 ASP.NET MVC と SQLServerに対応できている国内のHosting Serviceとなると、

 

DataJapanのExpressWeb 
これがいい感じですね。というかここしか見つけられなかったです。
Windows Azureって選択肢もありますが、おじさんのお小遣いの範囲ではまずはこっちで腕を磨いてってことにしました。
ドメイン取得とExpressWebの合計で1年で¥4,725でした。
 
さて、今回のデプロイに当たっては、ネット上の先達がいろんな情報を提供してくれています。おかげ様で予想以上の短時間でデプロイすることができました。
特に参考になったページを紹介します。
しばやん雑記 ASP.NET MVC 3 開発入門 (22) - Web.config を変更
http://shiba-yan.hatenablog.jp/entry/20110507/1304694517
しばやん雑記 ASP.NET MVC 3 開発入門 (23) - Web 発行のプロファイルを作成
http://shiba-yan.hatenablog.jp/entry/20110527/1306422053
しばやん雑記 ASP.NET MVC 3 開発入門 (24) - ExpressWeb へ発行する
http://shiba-yan.hatenablog.jp/entry/20110527/1306422517
だるろぐ 認証機能付きの新規アプリケーションを ExpressWeb へ発行してみる
http://daruyanagi.jp/entry/2012/02/20/224419
テスターですが何か? ExpressWebにCodeFirstアプリを載せた
http://david9142.wordpress.com/2012/01/09/expressweb%e3%81%abcodefirst%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e8%bc%89%e3%81%9b%e3%81%9f/
テーブルに保存されているデータを使って SQL の INSERT 文を生成する簡単な方法(SQL Server 限定)
http://tnakamura.hatenablog.com/entry/20100915/sql_server_management_studio_generate_script
方法: Visual Studio でワンクリック発行を使用して Web アプリケーション プロジェクトを配置する
http://msdn.microsoft.com/ja-jp/library/dd465337.aspx
以上がとてもお世話になったページです。これらを見ていただければOKなんですが、せっかくなんで若干の補足を書いときますね。
私のところの環境は以下の通りです。

Windows7

SQL Server 2012 Express Edition (64-bit)

Visual Studio Express 2012 for Web

チャレンジの手順は以下の通りです。


1.発行設定ファイルをダウンロードする。

ExpressWebのコントロールパネルからWebサイトに進み、
「管理」タブからユーザーを追加しリモート管理を有効にします。
この手順については、以下のページが参考になります。
しばやん雑記 ASP.NET MVC 3 開発入門 (23) - Web 発行のプロファイルを作成
http://shiba-yan.hatenablog.jp/entry/20110527/1306422053
次は、上記のページと異なる部分になりますが、
ユーザーの追加が完了すると、「発行設定ファイルをダウンロードする」ことができるようになります。

f:id:SannomiyaNotes:20121228102910p:plain

『このサイト用の発行設定ファイル(PublishSettings)をダウンロードするにはこちらをクリックしてください』このリンクをクリックして発行設定ファイルをローカルにダウンロードしておきます。

 次はもう Visual Studio Express 2012 for Webで発行です

 

2.管理者モードでVisual Studioを起動します。

 

3.新規の発行プロファイルを作成します。

ツールバーの「発行」のリストボックスより<新規...>を選択します。

ツールバーに「発行」が表示されていない場合は、「表示」-「ツールバー」で表示されるリストの「Webの1クリック発行」にチェックを入れると、ツールバーの「発行」が表示されるようになります。

 

4.発行設定ファイルをインポートします。

「Webを発行」のダイアログが表示されたら「プロファイル」タブをクリック。

「発行プロファイルを選択またはインポート」の「インポートボタン」をクリック。

ファイルの指定で、1でダウンロードした発行設定ファイルを指定してインポートします。

 

5.接続の設定

インポートすると画面は「接続」画面に切り替わります。

f:id:SannomiyaNotes:20121228110119p:plain

この時点で、発行方法はWeb Deployで表示され、

サービスURL、サイト/アプリケーション、宛先URLはインポートした設定ファイルから初期表示されています。あとは、 1.で登録した、ユーザー名とパスワードを登録します。

さて、ここで「接続の確認」をクリックすると、チェックOKならチェックマークがつくのですが、私の場合どうしたことか、エラーというか警告になってしまいました。

「Web Deploy タスクに失敗しました。(リモートコンピュータでの要求の処理中にエラーが発生しました。)」というメッセージがダイアログに表示されます。

いろいろ試したのですが原因を突き止めることはできませんでした。実はその後、この警告を無視して「発行」を行うと発行ができてしまいました。今ではこのエラー再現できなくなっています。

あと、どのタイミングか失念しましたが(「接続の確認」クリック時かな?)こんなダイアログが表示されました。

f:id:SannomiyaNotes:20121228111522p:plain

証明書がプライベートなものだからかな?と思いつつ「承諾」を選択しました。

 

 6.設定

 「接続」の次は「設定」です。

実は、この部分一発ではうまくいかなくて何度か試行錯誤を行ってます。

で、初回の画面ショットもとれてなくて以下の画面はこんな画面だったかな?という感じの画面ショットです。

f:id:SannomiyaNotes:20121228131632p:plain


データベースの接続文字列は、多分設定ファイルから持ってきてくれてたように思います。

想像ですが、Web.configの<connectionStrings>に相当する部分でしょう。

私の場合、SQLServerSQL認証で使っており、SQLServerのユーザーとパスワードを接続文字列に含めたいのです。デフォルトで表示された値はサーバー名しか表示されていない。そこで「...」ボタンをクリックして対象の接続文字列を作成しようとしたのですが、このダイアログ「OK」ボタンクリックすると、実際に接続に行ってしまいます。イントラネットならいいんでしょうが、インターネット経由では当然つながらずです。結局、Web.configの<connectionStrings>より手でサーバーの指定部分を変更して作成しコピペでセットしました。

この接続文字列ですが、発行のプロファイルに記憶されるので、ローカルのIIS用とExpressWeb用と複数のプロファイルを用意しておけば発行の都度変更する必要はありません。また、『Web.config 変換構文』を使えばもっと柔軟に対応できるようですが、今回はそこまではやってません。

興味のある方は、以下の情報が参考になります。

しばやん雑記 ASP.NET MVC 3 開発入門 (22) - Web.config を変更
http://shiba-yan.hatenablog.jp/entry/20110507/1304694517

Web アプリケーション プロジェクト配置の Web.config 変換構文

尚、ExpressWeb側のデータベース(SQLServer2008)とログインまでは、事前にExpressWebのコントロール画面より登録してあります。

 

7.発行

次は発行ボタンをクリックして発行します。

クリックすると、出力にログが表示され、次にページホームページが表示される

はずが、やっぱりエラーページが表示されました。

f:id:SannomiyaNotes:20121228131613p:plain

これじゃあエラーの原因ははっきりしません。そういえば
「だるろぐ 認証機能付きの新規アプリケーションを ExpressWeb へ発行してみる」に記載されてた、Web.confug にカスタムエラーを無効化する設定、
<system.web>に
    <customErrors mode="Off"/>
を追加して再度発行。

f:id:SannomiyaNotes:20121228132348p:plain

しっかり、エラーの原因を把握することができました。

今回の原因はなんと、、.Net Framework 4.5で開発しデプロイしようとしてた。。。

ExpressWebはNet Framework 4.0 MVC3までってなってます。気を付けなきゃと常々思ってたんですが、ついうっかりしてました。

プロジェクトのプロパティから.Net Frameworkを4.5から4.0に変更してみたんですが、ビルドしようにも「属性」系があちこちエラーになってます。

一から作り直した方が速そうなんで、新しいプロジェクトを作成しました。

4.5で開発したプロジェクトからこれから移植作業を行います。

でも、デプロイについて中途半端なので、とりあえずテンプレートで作成直後のプロジェクトをExpressWebに発行してみました。ユーザーの登録とログインまではちゃんと動作しますね。MVC3じゃなくMVC4です。

 

8.データベースのセットアップ

コードファーストが苦手な私は、データベースのスキーマの作成は手作りが好みです。ExpressWebのコントロールパネルから「データベース参照」をクリックすると「mylittleAdmin for SQLServer」というツールが立ち上がります。このツールを使ってスキーマの作成やデータの投入ができます。SQLServer Management Studioのようなツールです。ローカルのdbからの移植には、Management Studioの「スクリプトの生成とパブリッシュ」機能を使いました。Express Editionでもこの機能がつかえるなんてMSさん太っ腹ですね。このツールの詳細は以下のページで説明されてます。

テーブルに保存されているデータを使って SQL の INSERT 文を生成する簡単な方法(SQL Server 限定)

このツールを使ってCREATEやINSERT文(実データの挿入)を作って、「mylittleAdmin for SQLServer」の「新しいクエリ」で実行すれば出来上がりです。

mylittleAdminにスクリプトファイルを読み込む機能があればいいのですが、見当たらないので、ひとつひとつコピペで対応しました。

あと、失敗した点は「照合順序」。個人的に、SQLServerの照合順序は「Japanese_90_BIN2」を使いたいのですが、ExpressWebの照合順序は「

Japanese_CI_AS」のようです。データベースを作成直後にALTER DATABASEで
COLLATE を変更しておけばよかった。。もうテーブル作成しデータも入れてしまったぜ、残念ですがやり直します。
尚、「スクリプトの生成とパブリッシュ」の「スクリプト作成の詳細オプション」には「スクリプトの照合順序」という項目があります。こいつをtrueに変更しておけば、各スクリプトにCOLLATE文も含むことができます。
 
データベースのセットアップについては、Visual Studio の「プロパティ のページの SQL のパッケージ化/発行」使って1クリック発行できるんじゃないかなと、ちょっとだけ試してみたんですが、うまく動かずあきらめました。

ExpressWebがこの機能に対応できてるかはわかりません。

さて最後に、できあがりはこんな画面。といってもいつもの見慣れたページですが初めて外部サーバーへの公開。感無量です。

f:id:SannomiyaNotes:20121228142123p:plain

今回は以上です。