WCF サービス を利用して、RESTful Web サービス を作成します。 ただ WCF サービス プロジェクト を追加しただけだと Web サービス としてはうまく動作しなかったので、 キチンと動作するまでに必要な環境整備、実装を記載します。
サンプルコード の ダウンロード 。
環境構築
Visual Studio、.NET Framework 3.0 - 4.5 までが インストール済み の環境を仮定します。 その上で、以下の設定を行います。
- [コントロールパネル] を開きます。
- [プログラムのアンインストール] を選択します。
- [Windows の機能の有効化または無効化] を選択します。
- 次の項目を選択(有効化)します。
.NET Framework 3.5 (.NET 2.0 および 3.0 を含む) Windows Communication Foundation HTTP アクティブ化 Windows Communication Foundation 非 HTTP アクティブ化 .NET Framework 4.5 Advanced Services ASP.NET 4.5 WCF サービス HTTP アクティブ化 TCP アクティブ化 TCP ポート共有 メッセージ キュー (MSMQ) アクティブ化 名前付きパイプのアクティブ化
RESTful WCF サービス の 実装
- ソリューション に "WCF サービス アプリケーション" を追加します。
自動で追加される IService1.cs、 Service1.cs は、不要なコードを削除してそのまま使います。
System.ServiceModel.Activation
への参照を追加します。
- Global.asax を追加します。
- Global.asax の
Application_Start
に サービス への マッピング を記述します。
1234567891011protected
void
Application_Start(
object
sender, EventArgs e)
{
// Url ルートテーブル コレクション を取得
var routes = System.Web.Routing.RouteTable.Routes;
// サービス実態 (Service1 クラス) への マッピング を登録
routes.Add(
new
System.ServiceModel.Activation.ServiceRoute(
"SampleService"
,
new
System.ServiceModel.Activation.WebServiceHostFactory(),
typeof
(Service1)));
}
- Web.config に
aspNetCompatibilityEnabled="true"
を追記します。
123456789101112131415161718192021222324<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
configuration
>
<
system.web
>
<
compilation
debug
=
"true"
targetFramework
=
"4.0"
/>
</
system.web
>
<
system.serviceModel
>
<
behaviors
>
<
serviceBehaviors
>
<
behavior
>
<!-- メタデータ情報の開示を避けるには、展開する前に、下の値を false に設定し、上のメタデータのエンドポイントを削除します -->
<
serviceMetadata
httpGetEnabled
=
"true"
/>
<!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します -->
<
serviceDebug
includeExceptionDetailInFaults
=
"false"
/>
</
behavior
>
</
serviceBehaviors
>
</
behaviors
>
<
serviceHostingEnvironment
multipleSiteBindingsEnabled
=
"true"
aspNetCompatibilityEnabled
=
"true"
/>
</
system.serviceModel
>
<
system.webServer
>
<
modules
runAllManagedModulesForAllRequests
=
"true"
/>
</
system.webServer
>
</
configuration
>
- IService1.cs に
Greeting
インターフェース を定義します。
この サンプルコード の場合、次のアドレスでアクセスできます。
http://[SERVER_NAME]/[SERVICE_NAME]/Greeting/{name}SERVICE_NAME は Global.asax で Urlルートテーブル に登録したサービス名(今回だと SampleService)になります。1234567[ServiceContract]
public
interface
IService1
{
[OperationContract]
[WebInvoke(Method =
"GET"
, ResponseFormat = WebMessageFormat.Json, UriTemplate =
"Greeting/{name}"
)]
string
Greeting(
string
name);
}
- Service1.cs に
Greeting
インターフェース を実装します。
クラス に対してActivation.AspNetCompatibilityRequirements 属性
をAspNetCompatibilityRequirementsMode.Allowed
で設定します。123456789[System.ServiceModel.Activation.AspNetCompatibilityRequirements(
RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]
public
class
Service1 : IService1
{
public
string
Greeting(
string
name)
{
return
"Hello "
+ name +
"."
;
}
}
- 作業は以上です。実行して正常動作するかどうか テスト します。
動作確認
プロジェクトを実行して、任意のブラウザで以下のアドレスへアクセスします。 正常に動作していれば、json のダウンロードができるはずです。
http://localhost:[PORT_NO]/SampleService/Greeting/ShinobuAkiyama
正常にサービスが動作しているかどうかは以下のアドレスで確認できます。
http://localhost:[PORT_NO]/Service1.svc
今回、以下のサイトを参考にしました。
- かずきのBlog@hatena - RESTでJSONなサービスをWCFで作ったり使ったりする
- MSDN マガジン - WCF を使用した RESTful サービスの概要
- MSDN - RouteTable メンバ
- MSDN - ServiceRoute クラス
- MSDN - WebServiceHostFactory クラス
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!