2010年3月30日火曜日

[WCF](暫定)WCFでSoapとRestを共通で

はじめてのWCFです。

ホントはRestとNamedPipeをやりたかったけど、IIS7.0がいるって事らしいのであきらめました。
なんで、SoapとRestの共通化(?)する方法。

まず、適当なWcfサービスを作って、「System.ServiceMode.Web」を参照設定する。
InterfaceにUsing System.ServiceMode.Web; なんて書いてGetMessageなんてメソッドを作る。
この時、Attributeに「WebGet」をつける。

  1. [WebGet(UriTemplate = "GetMessage/{key}/")]  
  2. [OperationContract]  
  3. string GetMessage(string key);  
実処理も適当に実装。
  1. public string GetMessage(string key)  
  2. {  
  3.     return "IService1.GetMessage + " + key;  
  4. }  
以上で、Wcfサービスのコーディングは完了。 後はWeb.Configの設定。 system.serviceModelの中を色々と変更。 まず、behaviorsを書く。
  1. <behaviors>  
  2.   <servicebehaviors>  
  3.     <behavior name="WcfService1.Service1Behavior">  
  4.       <servicemetadata httpgetenabled="true">  
  5.     </servicemetadata></behavior>  
  6.   </servicebehaviors>  
  7.   <endpointbehaviors>  
  8.     <behavior name="WcfService1.Service1Behavior">  
  9.     </behavior>  
  10.     <behavior name="WcfService1.Service1RestBehavior">  
  11.       <webhttp>  
  12.     </webhttp></behavior>  
  13.   </endpointbehaviors>  
  14. </behaviors>  
次にservices.serviceにendPointを書く。
  1. <services>  
  2.   <service behaviorconfiguration="WcfService1.Service1Behavior" name="WcfService1.Service1">  
  3.     <endpoint address="Soap" behaviorconfiguration="WcfService1.Service1Behavior" binding="basicHttpBinding" name="SoapEP" contract="WcfService1.IService1">  
  4.     <endpoint address="Rest" behaviorconfiguration="WcfService1.Service1RestBehavior" binding="webHttpBinding" name="RestEP" contract="WcfService1.IService1">  
  5.     <endpoint address="mex" binding="mexHttpBinding" name="Mex" contract="IMetadataExchange">  
  6.   </endpoint></endpoint></endpoint></service>  
  7. </services>  

addressのあたりをユニークに設定するとうまくいくらしい。

で、これを使うWebサイトを作って、Web参照すると普通にSoapで使える。
ブラウザから「http://localhost:8080/Service1.svc/Rest/GetMessage/TestMessage/」なんて打てば、
IService1.GetMessage + TestMessage
こんなレスポンスがもらえると。