テスターですが何か?

ホビープログラマ略してHPです

Azure OS 2系(Windows Server 2008 R2)でWCF RESTサービスが404になる

leave a comment »

こちらのエントリーで紹介した方法でWCF RESTサービスを作成してずっと動いていたのですが、Windows Azure Accelerator for Web Rolesの導入を機にOSを Azure OS 2.*(Windows Server 2008 R2ベース)にしたらサービスが動かなくなってしまいました。ブラウザから確認すると、以下のように正真正銘の404です。

image

いろんな環境で確認してみると、以下のような結果になりました。

環境 結果
Windows 7 x64 OK
Windows Server 2008 R2 NG
Azure OS 1.* (Server 2008ベース) OK
Azure OS 2.* (Server 2008 R2ベース) NG

Windows Server 2008 R2ベースのOS(IIS?)で動かないのなら、Windows 7でも動かないと思うんですが。IISのバージョンでも、x86とx64の違いでもなさそうですし、.NET Frameworkのバージョンもすべて4ですし、何の違いで動かなくなっているのかが全くわかりません。

Webでいろいろ調べた結果、MSDNに興味深いコンテンツがありました。ほかにも参考にすべきページがありました。

System.Web.Routing 統合

RESTでJSONなサービスをWCFで作ったり使ったりする

System.Web.Routing RouteTable not working with IIS?

これを読む限り、WCFでRESTっぽくサービスを作るためにはそもそもこのページに書かれている内容を実施すべきな気がしてきました。今までの実装方法でたまたま動いていて、本来の実装方法ではなかったのかもしれません。

 

1.Global.asax.csの変更

ルートテーブルにルーティング設定を登録することで、拡張子svcを指定しなくてもサービスにアクセスできるようにします。

System.ServiceModel.Activationの参照設定を追加し、Application_Startメソッドにルーティング設定を追加します。

        protected void Application_Start()
        {
            RouteTable.Routes.Add(new ServiceRoute("Customers", new WebServiceHostFactory(), typeof(Service1)));

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

ん?この時点であれ?と思いました。実際に動くなくなったアプリケーションも、作成しているミニマムコードもASP.NET MVC3プロジェクトなんですね、MVC3プロジェクトにWebサービス(WCF *.svc)を追加してRESTっぽく動かしています。上記ルーティングの追加は、MVC3のルーティングと相性が悪いんじゃないかと思います。

 

そもそも、MVC3アプリにWCF REST Webサービスを追加することがそもそも間違っていて、素直にControllerを追加して実装すべきなんですよ!!

 

WCFを使いたいのであれば、ASP.NETプロジェクトに追加するのではなくて、WCFサービスアプリケーションのプロジェクトテンプレートを使うべきなんだと思います。いちおう、MSDNのページ「System.Web.Routing 統合」の通りに設定してみましたが、うまくいきませんでした。具体的には

  • WCFのサービスはRESTっぽく実行できる(ブラウザからURL指定で実行できた)
  • MVC3で作ったページが全部Global.asaxで設定したページへルーティングされてしまう

次に、すなおにWCFサービスアプリケーションプロジェクトテンプレートを使ってRESTっぽいサービスをつくって動かしてみました、やっぱり動きます。

 

それではまとめです。

1.なぜWCFのサービスが動かないのか

  • MVC3プロジェクト内にWCF(*.svc)を追加しているため、MVC3のルーティングとWCFで設定したルーティングの相性が悪くWCFのサービスが404になってしまった(と思われる)
  • なぜ、Windows, Azure OSのバージョン間で実行結果が異なるのかは分からない w

 

2.そもそもどうすべきか

  • MVC3プロジェクトであれば、WCF RESTっぽいサービスを追加するのではなく、Controllerを追加して実装すべき
  • WCFを使いたいのであれば、プロジェクトを分けてWCFサービスアプリケーションプロジェクトテンプレートを使うべき

 

生煮えなエントリー、結論になってしまいました。Twitterでコメントをいただき、結果を期待されている方がいらっしゃったら申し訳ありません。今の自分の力ではこれが精一杯です。他にもやりたいことがたくさんあるので、いったんここでこの話題は終了とします。

Written by david9142

2011年9月11日 @ 11:59 AM

カテゴリー: WCF, WindowsAzure

Tagged with ,

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。