読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

WCF入門-018 (基本的なサンプル, webHttpBinding, REST, WebInvoke, WebGet)

C# WCF


webHttpBindingの基本についてのメモ。
CodeProjectにWCF RESTサービスについての素晴らしい記事があったので
それを参考にしたメモです。


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はターゲットを

.NET Framework 4

にしないと出てきません。通常、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



================================
過去の記事については、以下のページからご参照下さい。