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 と、wcf の wsdl を見比べてみる。
両方ともドキュメントスタイル。
違いは・・・。
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 な型はまだ検証してないけど、ある程度まではいけそう。