<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>WCF</title><link>http://blogs.wankuma.com/kazuki/category/2031.aspx</link><description>WCF</description><managingEditor>k.ota.0130あっとgmail.com(かずき)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C#][WCF]DataContractって</title><link>http://blogs.wankuma.com/kazuki/archive/2008/12/21/164599.aspx</link><pubDate>Sun, 21 Dec 2008 20:17:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/12/21/164599.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/164599.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/12/21/164599.aspx#Feedback</comments><slash:comments>4285</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/164599.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/164599.aspx</trackback:ping><description>&lt;p&gt;WCFのサービスで、戻り値や引数に自分で作ったクラスを使うときに、クラスにDataContractとかDataMenber属性をつけたりしないといけない。&lt;br&gt;これって何だろう？？というところから調査スタート。&lt;/p&gt; &lt;h1&gt;DataContractSerializer&lt;/h1&gt; &lt;p&gt;結論から言うと、DataContract属性やDataMember属性は、DataContractSerializerという新しいクラスで使われるものらしい。&lt;br&gt;このクラスは、System.Runtime.Serializationを参照に追加することで使えるようになる。&lt;br&gt;コンソールアプリケーションでDataContractSampleというプロジェクトを作って参照を追加して試してみよう。&lt;/p&gt; &lt;p&gt;まず、いつものPersonクラスを作成する。&lt;br&gt;この段階では、まだ属性はつけていない。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:473b46c9-3215-4553-bd0c-57d3e33bdaa9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;こいつに属性をつけていく。&lt;br&gt;つける属性は、System.Runtime.Serialization.DataContractとSystem.Runtime.Serialization.DataMemberの２つになる。&lt;br&gt;DataContractはクラスに、DataMemberはプロパティに付け足す。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5d6fb39f-06e5-49ae-9475-5999dc5380c4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;[System.Runtime.Serialization.DataContract]
public class Person
{
    [System.Runtime.Serialization.DataMember]
    public int ID { get; set; }
    [System.Runtime.Serialization.DataMember]
    public string Name { get; set; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;属性をつけたら、以下のようなコードでXML形式へシリアライズできる。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2f26ab4b-6d10-4295-b4a2-7fe22de45d13" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;// コンストラクタにターゲットの型を渡す
var ds = new DataContractSerializer(typeof(Person));

// 出力先を作成
var sw = new StringWriter();
var xw = new XmlTextWriter(sw);
// 人間に優しい見た目にして
xw.Formatting = Formatting.Indented;

// いざXMLへ！
ds.WriteObject(xw, new Person { ID = 1, Name = "田中　太郎" });

// 結果確認
Console.WriteLine(sw);
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行結果&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c4ed843f-1513-4159-ba75-d81478aff356" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DataContractSample"&amp;gt;
  &amp;lt;ID&amp;gt;1&amp;lt;/ID&amp;gt;
  &amp;lt;Name&amp;gt;田中　太郎&amp;lt;/Name&amp;gt;
&amp;lt;/Person&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ばっちりだ。もちろんXMLからクラスのインスタンスへ復元も可能。&lt;br&gt;さっきのコードに続けて、以下のようなコードでXMLからオブジェクトのインスタンスへ復元できる。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1ee75a94-8420-4096-9cd4-68515321e677" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;// デシリアライズ
var sr = new StringReader(sw.ToString());
var xr = new XmlTextReader(sr);
var person = (Person)ds.ReadObject(xr);
Console.WriteLine("ID:{0}, Name:{1}", person.ID, person.Name);
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行結果&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5ae77bfd-cade-4e6e-94a5-9ed964f3903b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;ID:1, Name:田中　太郎&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ということでDataContractのまとめ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DataContractSerializerで使われる&lt;/li&gt;
&lt;li&gt;System.Runtime.Serializationを参照に追加することで使用可能。&lt;/li&gt;
&lt;li&gt;DataContractをクラスへ、DataMemberをプロパティへつける。&lt;/li&gt;
&lt;li&gt;DataContractSerializerのWriteObjectでシリアライズ、ReadObjectでデシリアライズできる&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;以上、超簡単な使い方でした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/164599.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WCF][C#]Hello World作成の動画</title><link>http://blogs.wankuma.com/kazuki/archive/2008/12/18/164204.aspx</link><pubDate>Thu, 18 Dec 2008 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/12/18/164204.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/164204.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/12/18/164204.aspx#Feedback</comments><slash:comments>444</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/164204.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/164204.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/kazuki/archive/2008/12/16/163931.aspx"&gt;先日のエントリ&lt;/A&gt;に書いたWCFのHello Worldと同程度のものを作る操作を動画にしてみた。&lt;BR&gt;解説も何も無く、ただただひたすら作っていくだけなのでつまらないものになりそうですが&amp;#8230;。&lt;/P&gt;
&lt;P&gt;はじめて録画してみたので記念アップもかねて（笑）&lt;/P&gt;
&lt;P&gt;これで見れるのかな？？？&lt;/P&gt;
&lt;iframe scrolling="no" marginheight="0" marginwidth="0" frameborder="0" 
style="width:240px;height:26px;margin:3px;padding:0;border:1px solid #dde5e9;background-color:#ffffff;" 
src="http://cid-c0989b857f2f850c.skydrive.live.com/embedrow.aspx/%e5%85%ac%e9%96%8b/movie/WcfHelloWorld.swf"&gt;
&lt;/iframe&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/164204.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WCF][C#]WCF超入門</title><link>http://blogs.wankuma.com/kazuki/archive/2008/12/16/163931.aspx</link><pubDate>Tue, 16 Dec 2008 22:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/12/16/163931.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/163931.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/12/16/163931.aspx#Feedback</comments><slash:comments>1943</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/163931.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/163931.aspx</trackback:ping><description>&lt;p&gt;色々なものに触発されたので、WCFの超入門をしてみようと思う。&lt;br&gt;何に触発されたかは秘密です。&lt;/p&gt; &lt;p&gt;WCFって何？ということだけど、今まではASP.NET 2.0までのasmxのちょっと豪華版と思ってた。&lt;br&gt;もうちょっとちゃんというと下位の通信レイヤに依存しないプログラミングモデルを提供してくれるものらしい。&lt;br&gt;TCP/IPでもHTTPでも名前つきパイプでも何でも同じプログラムで動いちゃう。&lt;/p&gt; &lt;p&gt;そんな素敵なものがWCF。&lt;br&gt;ただし、現時点では色々出来るが故に、ちょっと難しい。&lt;br&gt;でもまぁ、Hello Worldくらいなら、asmxでWebサービス作るのと大差無い…？と思ってやってみようと思う。&lt;/p&gt; &lt;p&gt;とりあえず、プロジェクトの大枠を作る。&lt;br&gt;プロジェクトは、WcfHello.ServerとWcfHello.Clientという２つのコンソールアプリケーションを用意する。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb.png" width="226" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;双方に参照設定で、&lt;strong&gt;&lt;font size="4"&gt;System.ServiceModel&lt;/font&gt;&lt;/strong&gt;を追加する。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_3.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="171" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_3.png" width="234" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;こいつが、WCF関連のクラスが詰まったアセンブリになる。&lt;/p&gt; &lt;p&gt;ここからは、プログラムをがしがし作っていく。&lt;br&gt;まず、WcfHello.ServerのProgram.csにコードを足していく。&lt;/p&gt; &lt;p&gt;コードを足す前に、今回作るものの最終目標を決めておく。&lt;br&gt;最終目標は、nameを渡すと、nameさんこんにちは！というサービスを作って、それを呼び出すクライアントを作るというものにしよう。&lt;/p&gt; &lt;p&gt;Program.csに以下のインターフェースを定義する。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bfd36af6-7a8c-4166-838b-85e65c3c335e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;public interface IGreeter
{
    string SayHello(string name);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;これがnameを受け取って nameさんこんにちは！という文字列を返すサービスの外っ面になる。&lt;br&gt;外っ面が出来たので、実装も作成する。インターフェースの定義の下に以下のような実装クラスを足す。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:02899a40-234c-4d45-9f89-0e8473602786" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;public class Greeter : IGreeter
{
    public string SayHello(string name)
    {
        return name + "さんこんにちは！";
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;10人が書いたら9人くらい同じコードになりそうな実装だと思うので見ただけでわかると思う。&lt;br&gt;こいつに、WCFのお作法に従って属性をつけていく。&lt;br&gt;属性をつけるのは、インターフェース側になる。インターフェースにつける属性としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System.ServiceModel.ServiceContract 
&lt;li&gt;System.ServiceModel.OperationContract&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;の２つになる。&lt;br&gt;前者が、サービスとして公開するインターフェースにつけて、後者が、メソッドにつける。&lt;br&gt;別に難しくないので、さくっとつけていこう。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6089c7b2-069f-43ea-9383-54244ea13802" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;[System.ServiceModel.ServiceContract]
public interface IGreeter
{
    [System.ServiceModel.OperationContract]
    string SayHello(string name);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;これで半分準備完了。&lt;br&gt;とりあえず、こいつを公開するために、WCFのランタイムにお願いをするコードをMainに書いていく。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0cd345c4-ae8d-4652-a039-3b07a66396ed" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;class Program
{
    static void Main(string[] args)
    {
        // ServiceHostが、サービスをホストする（そのまんま）クラス。
        // コンストラクタに、サービスとして公開する実装クラスの型を渡す。
        using (var host = new System.ServiceModel.ServiceHost(typeof(Greeter)))
        {
            // Openでサービス起動
            host.Open();

            // Enterが押されるまで待つ
            Console.WriteLine("WCFサービス起動したよ");
            Console.ReadLine();

            // 最後にきちんと閉じる
            host.Close();
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;WCFのサービスとして公開するためのメソッドも凄く簡単に書ける。&lt;br&gt;コメントのほうが多いくらいだ。&lt;/p&gt;
&lt;p&gt;ただし、悲しいことにこれを実行すると例外が出てしまう。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="171" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_4.png" width="662" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;色々エラーメッセージで言われているが、要は構成ファイルがないよ？ということになる。&lt;br&gt;WCFのサービスは、このサービスを公開するためのアドレスと、どういうプロトコルを使うかと、どのインターフェースで公開するかという３つの情報を定義しないといけない。&lt;/p&gt;
&lt;p&gt;.NETで定義といったらapp.config。&lt;br&gt;このWCFの構成を書くためのツールが、Visual Studioとは統合されてないけどWindows SDKの中に入っています。&lt;br&gt;とはいっても、Visual Studioから起動したいので、以下の手順でVisual Studioから起動できるようにします。&lt;br&gt;App.configを新規作成したら、右クリックしてファイルを開くアプリケーションの選択をクリックします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_5.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_5.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;色々出てきますが、追加をクリックします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_6.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="97" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_6.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;プログラム名に「C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcConfigEditor.exe」を入力して、表示名を適当にしてOKを押します。&lt;br&gt;そうすると、一覧に追加されます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_7.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="83" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_7.png" width="222" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;SvcConfigEditor.exeを選択した状態で開くと、以下のような便利な構成ファイルのエディタが開きます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_8.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="164" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_8.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;今回は、サービスを使うので、サービスの作成リンクをクリックします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_9.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="110" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_9.png" width="206" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;サービス型を選択します。ここで、選択するのはサービスの実装クラスになります。&lt;br&gt;参照ボタンを押してExeを読み込むと、自動で一覧に出してくれるので、そこから選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_10.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="129" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_10.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次に、サービスコントラクトを設定します。これは、サービスのインターフェースを指定します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_11.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="104" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_11.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次に、サービスで使用する通信モード（プロトコル？）を選択します。ここでは最初から入力されてるHTTPを選択します。&lt;br&gt;これで、普通のSOAP over HTTPでのサービスと、大体同じになるはず。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_12.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_12.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;使用する相互運用もデフォルトのまま次へ。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_13.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="162" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_13.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次にアドレスを設定します。サービスの呼び出し時に指定したりします。&lt;br&gt;ここでは、&lt;a href="http://localhost:8080/WcfHello.Server/Greeterを指定してます。"&gt;http://localhost:8080/WcfHello.Server/Greeterを指定してます。&lt;/a&gt;&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_14.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="130" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_14.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;以上のウィザードを完了させると、なんとかサービスとして形が整ってきました。&lt;br&gt;この時点でも、一応サービスとしては起動します。&lt;/p&gt;
&lt;p&gt;ただし！！注意点としては、&lt;strong&gt;&lt;font color="#ff0000"&gt;Vistaを使ってる場合に、Visual Studio 2008を管理者権限で動かしてないとサービスの登録処理で権限が無いと例外が出てしまいます。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;その部分にだけ気をつけて実行すると、以下のようにコンソールに味気ない文字列が表示されます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_15.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="90" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_15.png" width="218" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ただ、これだと本当に必要最低限の機能しかありません。一応SOAP over HTTPの呼び出しに応じることは出来るけど、本当にそれしか出来ない。&lt;br&gt;例えば、WCFのクライアントを作るためのWSDLも提供されてない状態です。&lt;/p&gt;
&lt;p&gt;WCFのサービスにWSDLの公開などといった付加的な機能を追加するのが、サービス動作(ServiceBehavior)です。&lt;br&gt;直訳の弊害がかもしれませんが、付加的な機能を追加するものと覚えておけば良さそう。&lt;/p&gt;
&lt;p&gt;ServiceBehaviorを追加するには、App.configの編集ツールで 詳細設定/サービス動作という部分で右クリックして「新しいサービス動作の構成」を新規作成をします。&lt;br&gt;新規作成をしたら、NewBehaviorが作られます。こいつに追加する機能を定義していきます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_16.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="105" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_16.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;serviceMetadataというものがWSDLを公開するための機能なので、追加ボタンを押してserviceMetadataを追加します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_17.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="142" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_17.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;そうすると、画面左側のツリーにserviceMetadataが追加されるので、それを選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_18.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="117" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_18.png" width="228" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;そうすると、serviceMetadataのプロパティが下のように表示されます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_19.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="150" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_19.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;プロパティの中から、HttpGetEnabledをTrueに、HttpGetUrlを、&lt;a href="http://localhost:8080/WcfHello.Server/Greeter/mex"&gt;http://localhost:8080/WcfHello.Server/Greeter/mex&lt;/a&gt;に指定します。&lt;br&gt;因みに、mexというのはMetadata Exchangeというものの略みたいです。&lt;/p&gt;
&lt;p&gt;以上でBehaviorの設定が終わったので、サービスとの関連付けをやります。WcfHello.Server.Greeterを選択して、BehaviorConfigurationの値をNewBehaviorにします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_20.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="102" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_20.png" width="647" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;以上で、サービス側の設定は完了です。&lt;br&gt;Serverを起動してブラウザで、&lt;a href="http://localhost:8080/WcfHello.Server/Greeter/mex"&gt;http://localhost:8080/WcfHello.Server/Greeter/mex&lt;/a&gt;にアクセスすると以下のような画面が表示されます。WSDLがきちんと表示されています。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_21.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="172" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_21.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次に、クライアント側を作っていきます。&lt;br&gt;クライアント側は、WCFのクライアントを作って呼び出しを行うだけなので非常に簡単です。&lt;br&gt;ということで、やってみます。&lt;/p&gt;
&lt;p&gt;WcfHello.Clientプロジェクトを右クリックして、サービス参照の追加を選択します。&lt;br&gt;サーバーは起動した状態のまま、サービス参照の追加のダイアログに「&lt;a href="http://localhost:8080/WcfHello.Server/Greeter/mex"&gt;http://localhost:8080/WcfHello.Server/Greeter/mex&lt;/a&gt;」を入力します。&lt;br&gt;URLを入力した後に移動ボタンを押下すると、下の画面のようにサービスが検出されるのでOKを押してサービス参照を追加します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_22.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="234" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_22.png" width="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; 以上の作業でWCFのクライアントのProxyが作成されます。&lt;br&gt;Proxyは、サービス名Clientという名前のクラスで作られています。使い方は、Proxyのインスタンスをnewで作り、普通にメソッドを呼び出すだけです。&lt;br&gt;最後にCloseを呼ぶのを忘れなければ完璧です。&lt;/p&gt;
&lt;p&gt;今回のGreeterというサービスのSayHelloを呼び出す処理は以下のようなコードになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;WcfHello.ClientのProgram.cs&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:adb7e11d-d640-4584-ae61-6dcfb38c82e9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System;

namespace WcfHello.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            // Proxyクラスを作成して
            var proxy = new ServiceReference1.GreeterClient();
            // SayHelloの呼び出し
            var message = proxy.SayHello("かずき");
            // 最後にCloseで閉じて
            proxy.Close();

            // メッセージ出力
            Console.WriteLine(message);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;サーバーを起動した状態で、WcfHello.ClientをスタートアッププロジェクトにしてCtrl + F5で起動させると、下のような実行結果になります。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_23.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="58" alt="image" src="http://kazuki.wankuma.com/images/2008/WCFCWCF_570/image_thumb_23.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;うん。ちゃんとサービスが呼び出せている。&lt;br&gt;満足満足。 &lt;/p&gt;
&lt;p&gt;最後に、このBlogでWCFに少しでも興味が沸いた人は、マイクロソフトの赤間さんのBlogに濃い内容が書いてあるのでそちらを見てみると、凄くいいと思います！&lt;br&gt;というか、ここに書いたことは、下に書いてあることの超はしょった版です。&lt;br&gt;&lt;a title="http://blogs.msdn.com/nakama/archive/2008/09/18/part-1-wcf.aspx" href="http://blogs.msdn.com/nakama/archive/2008/09/18/part-1-wcf.aspx"&gt;http://blogs.msdn.com/nakama/archive/2008/09/18/part-1-wcf.aspx&lt;/a&gt;&lt;br&gt;&lt;a title="http://blogs.msdn.com/nakama/archive/2008/09/25/part-2-hello-world-wcf.aspx" href="http://blogs.msdn.com/nakama/archive/2008/09/25/part-2-hello-world-wcf.aspx"&gt;http://blogs.msdn.com/nakama/archive/2008/09/25/part-2-hello-world-wcf.aspx&lt;/a&gt;&lt;br&gt;&lt;a title="http://blogs.msdn.com/nakama/archive/2008/10/02/part-3-hello-world-wcf.aspx" href="http://blogs.msdn.com/nakama/archive/2008/10/02/part-3-hello-world-wcf.aspx"&gt;http://blogs.msdn.com/nakama/archive/2008/10/02/part-3-hello-world-wcf.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/163931.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>