webHttpBindingの基本についてのメモ。
CodeProjectにWCF RESTサービスについての素晴らしい記事があったので
それを参考にしたメモです。
- Windows Communication Foundation and RESTful Web Services Primer
- WCFの参考リソース (CodeProject, REST, webHttpBinding, behaviorExtensions, リンク)
WCFでは、.NET Framework 3.5よりRESTサービスを作成する機能が追加されました。
RESTサービスを追加する際に利用するバインディングは以下のものです。
webHttpBinding
webHttpBindingを利用する場合、サービスメソッドにOperationContractに加えて
以下の属性のどちらかを付与します。
- WebInvoke
- WebGet
WebInvokeは、GET以外の場合(POST, PUT, DELETE)も利用できる属性です。
WebGetは、GET専用の属性となります。
注意点として、WebInvoke属性やWebGet属性は
System.ServiceModel.Web
に存在します。System.ServiceModel.Webは、
System.ServiceModel.Web.dll
に存在しますので、上記のDLLを参照設定する必要があるのですが
このDLLはターゲットを
にしないと出てきません。通常、WCFサービスライブラリプロジェクトを
作成するとClient Profileにターゲットが設定されているので変更する必要があります。
以下、サンプルです。
まずは、サービスインターフェース。2つのメソッドの両方に
WebInvoke属性を付与しています。レスポンスのフォーマットはjson形式で
データはラップせずにそのままの状態で返却するよう設定しています。
メソッドはどちらもGETです。
UriTemplateは、サービスが公開された際にどのようなURLで
アクセスできるようにするかを設定します。
SayHelloメソッドの場合、"hello/{name}"と設定しているので
ttp://localhost/xxx/hello/hogehoge
のようにアクセスされると、このメソッドがnameパラメータに"hogehoge"を
指定された状態で呼び出されます。
GetStreamメソッドの方は、Streamを返却するようになっています。
RESTでは、大きなデータやファイルなどを返却する際に利用する模様。
using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.ServiceModel; using System.ServiceModel.Web; namespace Gsf.Samples.WCF { [ServiceContract(Namespace="http://Gsf.Samples.WCF")] public interface IMyService { // // RESTスタイルのサービスを作成するには // 以下のどちらかの属性を付与する必要がある。 // ・WebInvoke // ・WebGet // WebInvoke属性は、GET以外のメソッドにも利用できる。 // WebGet属性は、GET専用の属性. // [OperationContract] [WebInvoke( Method="GET" ,ResponseFormat=WebMessageFormat.Json ,BodyStyle=WebMessageBodyStyle.Bare ,UriTemplate="hello/{name}" )] string SayHello(string name); // // 大きなデータやファイルなどをクライアントに返す // 必要がある場合は、以下のように戻り値をStreamに // してメソッドを定義することも出来る。 // [OperationContract] [WebInvoke( Method="GET" ,ResponseFormat = WebMessageFormat.Json ,BodyStyle = WebMessageBodyStyle.Bare ,UriTemplate = "notepad" )] Stream GetStream(); } }
次に、サービスクラス。
using System; using System.Collections.Generic; using System.Linq; using System.IO; namespace Gsf.Samples.WCF { public class MyService : IMyService { public string SayHello(string name) { return string.Format("hello '{0}'", name); } public Stream GetStream() { return File.OpenRead(@"c:\windows\notepad.exe"); } } }
最後にアプリケーション構成ファイル。
RESTの場合でも、他の場合と同じように設定すれば良いのですが
webHttpBindingを利用する場合、EndpointBehaviorが必須となりますので注意が必要です。
<?xml version="1.0"?> <configuration> <system.serviceModel> <services> <service name="Gsf.Samples.WCF.MyService"> <host> <baseAddresses> <add baseAddress="http://localhost:8092/WCFSample013/MyService"/> </baseAddresses> </host> <endpoint name="epWebHttp" address="" binding="webHttpBinding" contract="Gsf.Samples.WCF.IMyService" behaviorConfiguration="webHttpEndpointBehavior" /> <endpoint name="epMex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="webHttpEndpointBehavior"> <webHttp /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
起動させた後、以下のURLにアクセスします。
ttp://localhost:8092/WCFSample013/MyService/hello/hoge
すると、ブラウザ上に以下のデータが表示されます。
Hello 'hoge'
同じように、
ttp://localhost:8092/WCFSample013/MyService/notepad
にアクセスすると、ファイルを保存ダイアログが表示されて
データがダウンロード出来ます。
サンプルは以下の場所にアップしてあります。
https://sites.google.com/site/gsfzero1/Home/WCFSample-017.zip?attredirects=0&d=1
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ