TechEdをふりかえる Part3

TechCollab2007-09-01


さて、Part3となりましたが引き続きTechEd情報をまとめてみます。おそらくTechEdネタはこれで最後となると思いますので(もちろん以外のMS技術ネタも今後まとめていきます)、張り切ってまとめていこうと思います。ということで、最後の今日は.NET3.5におけるWCF拡張についてを中心にまとめていこうと思います。

関連セッションとしては下記のセッション。

  • Windows Communication FoundationによるWeb2.0的"Webスタイル"サービスの開発〜REST、POX、JSON、とRSS/ATOM
WCFとは?

省略。皆さん知っているでしょうという前提に基づいての省略であって、決して面倒だからというものではないです。。。

.NET3.5におけるWCFのWebスタイルサービスサポートの概要

.NET Framework 3.0におけるWCFでは、Webサービスの利用といえば基本的にSOAP/WSDLベースのみがサポートされていたが、.NET Framework 3.5のWCFでは、よりWebフレンドリーなサービスがサポートされる(本セッションではWebスタイルサービスとして定義)。具体的な新機能の内容としては、「RESTスタイルサービスのサポート」、「メッセージフォーマットとしてPOX、JSONRSS/ATOM、その他バイナリをサポート」など。

.NET3.5におけるWCFのWebスタイルサービスサポートの詳細

具体的な実装としては次のようなものが追加。

  • アセンブリとしてSystem.ServiceModel.Webが追加
  • [WebGet]/[WebInvoke]属性の追加:サービスコンストラクトに付与して利用
  • バインディング種別としてwebHttpBindingが追加
  • サービスホスティングのクラスとしてWebServiceHost、WebScriptHostが追加
  • エンドポイントのビヘイビアとしてWebHttpBehavior、WevScriptBehaviorが追加
  • UriTemplateクラスの追加([WebGet][WevInvoke]属性と合わせての利用がメイン)
お試し実装(JSON利用)

Visual Studio 2008 Beta2 にて"WCF Service Application"のテンプレートを基に実装してみる。

  • サービスインタフェースとロジック実装

ここで重要なのはWebGet属性の追加。UriTemplateによりメソッドをRESTスタイルにコールできる。そしてResponceのフォーマットとしてJSONフォーマットを利用。つまり「/Data?nickname="hoge"」とGetData("hoge")が等価なイメージ。

[ServiceContract]
public interface IService1 
{
    [OperationContract]
    [WebGet(UriTemplate = "/Data?nickname={nickname}", ResponseFormat = WebMessageFormat.Json)]
    Person GetData(string nickname);
}

public class Service1 : IService1
{
    public Person GetData(string nickname)
    {
        Person p = new Person();
        switch(nickname){
            case "TechCollab":
                p.FullName = "Sousuke Hirayama";
                p.Hobby = "Saxophone";
                break;
            default:
                p.FullName = "Hoge Taro";
                p.Hobby = "music";
                break;
        }
        return p;
    }
}
  • コンフィグレーション

WCFのコンフィグレーションファイルには次のように記述。重要なのはbindingの属性としてwebHttpBindingを指定すること。

<configuration>
    <system.serviceModel>
        <services>
            <service name="Service1">
                <!-- Service Endpoints -->
                <endpoint contract="IService1" 
                  binding="webHttpBinding" 
                  bindingConfiguration="Service1Binding" 
                  behaviorConfiguration="Service1EndBehavior"/>
            </service>
        </services>
    
        <behaviors>
            <endpointBehaviors>
                <behavior name="Service1EndBehavior">
                    <enableWebScript/>
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
    
        <bindings>
            <webHttpBinding>
                <binding name="Service1Binding" />
            </webHttpBinding>
        </bindings>
    </system.serviceModel>

</configuration>
  • サービスホスト(.svc)
<%@ ServiceHost Language="C#" Service="WCFService1.Service1" CodeBehind="Service1.svc.cs" 
    Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
  • 実行結果

以上の準備でサービスの実装が完了するが、これらをデバッグ実行して開発サーバ上でホスティングしてもうまく動作しない(下記エラー)。これはバグらしく、IIS上にDeployして実行する必要がある。詳しくはこちらを参照。

"IIS specified authentication schemes 'Ntlm, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used."

http://localhost/wcfhost/Service1.svc/Data?nickname=%22TechCollab%22

ということで、IIS上にデプロイしサービスを実行し、上のクエリーを投げたところ次のJSON形式のオブジェクトが返答される。

{"d":{"__type":"Person:#WCFService1","FullName":"Sousuke Hirayama","Hobby":"Saxophone"}}

実際のサービス利用時にはプロキシを生成することになるが、JavaScript用のプロキシを生成することも可能。プロキシ用のコードが見たければ下のクエリで取得。

http://localhost/wcfhost/Service1.svc/js

ネタ

きましたね。BlackBerryiPhone端末もDocomoさん!?

こういうのは既存の主要インフラにのってかないとうまくいかない気がする。SuicaPasmoEdyなどなどやはり何かに統一されたら、この手のサービスものっかりやすいだろうし、発展もしやすいと思う。

最近はGoogle Gearsをおってないんで、これを機会に再勉強してみますかね。

ほほー。

メモとして。

http://www.artofoffice.com/artists/
Officeでartを創る意義は良くわからないが、色々かっこいいのもたくさんありますね。