WCF と通信してみる

まず、WCF のサービスを作ってみる。とりあえず VS2008 の Web サービスプロジェクトを作って、 WCF Service を追加。標準で準備されてる DoWork メソッドにちょいと色をつけてみる。

public class Service2 : IService2
{
  public string DoWork(string name)
  {
    return "Hello " + name;
  }
}


続いて AIR。WebService の定義を mxml に書いてやる。

<mx:WebService id="webservice" wsdl="http://localhost/WebService1/Service2.svc?wsdl" useProxy="false">
  <mx:operation name="DoWork" result="serviceResult(event)">
    <mx:request>
      <name>k_maru</name>
    </mx:request>
  </mx:operation>
</mx:WebService>


戻りを受け取る関数も定義してやる。

import mx.rpc.events.ResultEvent;

function serviceResult(event:ResultEvent)
{
  trace(event.result);
}


呼び出してみる。

webservice.DoWork.send();


エラー。
なんかスタイルがドキュメントか RPC かじゃないとダメって怒ってる。


wcfバインディングが wsHttpBinding になっている。

<endpoint address="" binding="wsHttpBinding" contract="WebService1.IService2">


たぶんこいつ。ws-securityとかついてるとダメなんかな? basicHttpBindingにしてみる。

<endpoint address="" binding="basicHttpBinding" contract="WebService1.IService2">


もう一回動かしてみる。
エラー。
でも、今度はストリームがなんチャラとかって言ってる。
どうやらドキュメントとか RPC とかは OK らしい。


なんとなく asmx でサービスを作って、つないでみる。
ここのコードは省略。
つながった。


asmx の wsdl と、wcfwsdl を見比べてみる。


両方ともドキュメントスタイル。
違いは・・・。


wcf のほうの xsd がインラインで記述されていない。


たぶん、こいつ。
ということで、インラインで書いてくれる設定を探す。


ない。。。ない。。。ない。。。


"wcf xsd inline" でググってみる。
もちろん「Web 全体から検索」。


あった。
http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx


wcf はすごいテクノロジーだよ!でも、 flex とか php とかからはつながらないんだよね〜」
的なことが書いてある。
あたり。


で、解決方法がのっていて、コードまでダウンロードできる。
どうやら ServiceHost とかを自前で実装して書き換えてるっぽい。よく分らん・・・。
後で調べることにする。


コードをダウンロードして、プロジェクトに組み込んで設定してみる。
書き換えたのは svc ファイルだけ。Factory 属性を追加してやった。

<%@ ServiceHost Language="C#" Debug="true" Service="WebService1.Service2" Factory="Thinktecture.ServiceModel.Extensions.Description.FlatWsdlServiceHostFactory" CodeBehind="Service2.svc.cs" %>


コンパイルして、起動。wsdl をのぞいてみるとスキーマがインラインで展開されている。
ということで、再度 AIR を動かしてみる。


トレースに "Hello k_maru" って表示された。
通った。
ありがとう、Christian Weyer


配列を返してやるメソッドを定義してみる。

public string[] GetPhotoUrls(string name)
{
  return new string[]
  {
    "http://farm4.static.flickr.com/3014/2413571394_2376a66ca3.jpg",
    "http://farm3.static.flickr.com/2195/2421330630_9c59e32bd3.jpg",
    "http://farm3.static.flickr.com/2412/2409712639_1410dd963b.jpg",
    "http://farm4.static.flickr.com/3001/2413513199_9dd4e7abaa.jpg",
    "http://farm4.static.flickr.com/3121/2405721704_ffcb625369.jpg",
    "http://farm3.static.flickr.com/2340/2417406346_e733f0b1f9.jpg"			
  };
}


mxml をちょこっと書いて、動かしてみる。


通った。


Complex な型はまだ検証してないけど、ある程度まではいけそう。