<?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/madoka/category/1527.aspx</link><description>Windows Communication Fundation</description><managingEditor>まどか</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>まどか</dc:creator><title>[WCF] DataMember属性</title><link>http://blogs.wankuma.com/madoka/archive/2008/02/13/123069.aspx</link><pubDate>Wed, 13 Feb 2008 21:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/madoka/archive/2008/02/13/123069.aspx</guid><wfw:comment>http://blogs.wankuma.com/madoka/comments/123069.aspx</wfw:comment><comments>http://blogs.wankuma.com/madoka/archive/2008/02/13/123069.aspx#Feedback</comments><slash:comments>75</slash:comments><wfw:commentRss>http://blogs.wankuma.com/madoka/comments/commentRss/123069.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/madoka/services/trackbacks/123069.aspx</trackback:ping><description>&lt;P&gt;クライアントとサービスの間で受け渡しするものにDataMember属性を付ける。&lt;BR&gt;プロパティの場合、通常、フィールドかプロパティのいずれかに付ける。&lt;/P&gt;
&lt;P&gt;&amp;lt;DataMember()&amp;gt; _&lt;BR&gt;Public Property Hoge() As String&lt;/P&gt;
&lt;P&gt;&amp;lt;DataMember()&amp;gt; _&lt;BR&gt;Private _Hoge As String&lt;/P&gt;
&lt;P&gt;値が""の場合、前者は受け取り側でNothingになってしまう。。。&lt;BR&gt;たぶん自動生成したクライアントコードのコメントアウトした部分に鍵がありそう。&lt;BR&gt;ちょっと調べてみようっと。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/madoka/aggbug/123069.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まどか</dc:creator><title>DLLのApp.config</title><link>http://blogs.wankuma.com/madoka/archive/2008/01/22/118716.aspx</link><pubDate>Tue, 22 Jan 2008 23:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/madoka/archive/2008/01/22/118716.aspx</guid><wfw:comment>http://blogs.wankuma.com/madoka/comments/118716.aspx</wfw:comment><comments>http://blogs.wankuma.com/madoka/archive/2008/01/22/118716.aspx#Feedback</comments><slash:comments>389</slash:comments><wfw:commentRss>http://blogs.wankuma.com/madoka/comments/commentRss/118716.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/madoka/services/trackbacks/118716.aspx</trackback:ping><description>&lt;P&gt;恥ずかしながら最近知ったのは、*.DLL.Config が自動で読み込まれないこと。&lt;BR&gt;そりゃそうだ、読むタイミングがないから。&lt;/P&gt;
&lt;P&gt;今回のプロジェクトは、ライブラリの提供まででアプリケーションは顧客が作る製品。&lt;BR&gt;WCF のクライアントがDLLになっていて構成ファイルをApp.config に書いて&lt;BR&gt;ユーザーが作るアプリケーションのApp.config はフリーにしてあげようというもくろみだった。&lt;BR&gt;が、あえなく失敗。&lt;/P&gt;
&lt;P&gt;WCF サービス側はもろApplyConfiguration メソッドで構成ファイル全体が読めるが&lt;BR&gt;クライアントはChannel など要素ごとのようだ。&lt;BR&gt;ファイル名を意識したりとかもあってちょっとやっかい。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/madoka/aggbug/118716.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まどか</dc:creator><title>[WCF] コールバックの注意点</title><link>http://blogs.wankuma.com/madoka/archive/2007/10/30/104990.aspx</link><pubDate>Tue, 30 Oct 2007 15:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/madoka/archive/2007/10/30/104990.aspx</guid><wfw:comment>http://blogs.wankuma.com/madoka/comments/104990.aspx</wfw:comment><comments>http://blogs.wankuma.com/madoka/archive/2007/10/30/104990.aspx#Feedback</comments><slash:comments>736</slash:comments><wfw:commentRss>http://blogs.wankuma.com/madoka/comments/commentRss/104990.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/madoka/services/trackbacks/104990.aspx</trackback:ping><description>&lt;P&gt;WCFで双方向、つまりサービスからクライアントへのコールバックをおこなう際の注意点。&lt;/P&gt;
&lt;P&gt;【WCF仕様】&lt;/P&gt;
&lt;P&gt;PerSession, Duplex, NetTCPBinding, ConcurrencyMode=Single&lt;/P&gt;
&lt;P&gt;【コード】&lt;/P&gt;
&lt;P&gt;※コントラクトや構成ファイル、SVCUTIL.exeによる自動生成クライアントコード等は一切省略。&lt;/P&gt;
&lt;P&gt;・Testメソッドを呼び出すとTestEventコールバックを発生させるというもの。&lt;/P&gt;
&lt;P&gt;【サービス定義】&lt;/P&gt;
&lt;P&gt;' User Service Callback&lt;BR&gt;Public Interface ITestCallback&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub TestEvent()&lt;/P&gt;
&lt;P&gt;End Interface&lt;/P&gt;
&lt;P&gt;' User Service&lt;BR&gt;Public Class TestService&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Service Method&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pubic Sub SomeMethod()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Service Method&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pubic Sub Test()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' この実行コンテキストが完了したタイミングでコールバックをおこなう&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler OperationContext.Current.OperationCompleted, AddressOf TestCompleted&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Test Method Completed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pubic Sub TestCompleted(ByVal sender As Object, ByVale As EventArgs)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cb As ITestCallback = OperationContext.Current.GetCallbackChannel(Of ITestCallback)()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cb.TestEvent()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;End Class&lt;/P&gt;
&lt;P&gt;【クライアント アプリケーション】&lt;/P&gt;
&lt;P&gt;・サービスメソッドを連続で呼び出す。&lt;/P&gt;
&lt;P&gt;Private Sub Button1_Click()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _TestClient.Test()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _TestClient.SomeMethod()　　*1&lt;/P&gt;
&lt;P&gt;End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;【現象】&lt;/P&gt;
&lt;P&gt;タイムアウトにて例外発生。&lt;BR&gt;現象的にはTest→SomeMethodの時点でSomeMethodの実行コンテキスト中にコールバックを送信しようとするため。&lt;BR&gt;※予想。　というか例外トレースの最終メソッドがSomeMethodで例外後にコールバック受信プロシージャに遷移する。&lt;BR&gt;この挙動はコントラクトのOneWayや同期／非同期呼び出しに関係なく発生する。&lt;BR&gt;元々メッセージが完結(実行コンテキストの完了=呼び出し元のステップを抜ける)を待たずに&lt;BR&gt;別のメッセージを発生させるとブロックされタイムアウトになることはMSDNで確認済み。&lt;/P&gt;
&lt;P&gt;なお、*1 をなくすと例外なく動作する。&lt;/P&gt;
&lt;P&gt;ちなみに実際の実装例としては、ログイン→ログイン通知受信→メンバ一覧取得のような場合がある。&lt;/P&gt;
&lt;P&gt;【現状の回避策】&lt;/P&gt;
&lt;P&gt;コールバックのコンテキスト(受信の実装)はクライアントに記述するが、&lt;BR&gt;そのコントラクトのConcurrencyMode=Singleによりコールバック受信時の処理が同期になる。&lt;BR&gt;現象で書いたように、Test→SomeMethodが動作するのはそれぞれがサービスへの要求つまり一方向であり&lt;BR&gt;また連続するステートメント(同期)であるのでTestの実行コンテキストが完了してからSomeMethodを送信しているためである。&lt;BR&gt;このことから、双方向のメッセージが(非同期のため？)重なってしまうことに原因がある。&lt;/P&gt;
&lt;P&gt;そこでコールバック専用のサービスを用意する。つまりポートを２つ使うことになる。&lt;BR&gt;さらにOperationCompletedイベントを&lt;BR&gt;サービス側：サービス要求受信→コールバック送信、クライアント側：コールバック受信→サービス要求&lt;BR&gt;の間で利用してメッセージを分断することにより上記動作を実現している。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;#MSDNが未整備で例も少なく大変です。。。&lt;BR&gt;#そんなわけで誰に確認したわけでもありません。あくまで私の調べた結果であります。&lt;BR&gt;#したがって、突っ込みは大歓迎です。間違ってたらえらいことになりますので(自分が)&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/madoka/aggbug/104990.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まどか</dc:creator><title>WCFのPerSession</title><link>http://blogs.wankuma.com/madoka/archive/2007/10/18/102814.aspx</link><pubDate>Thu, 18 Oct 2007 15:40:00 GMT</pubDate><guid>http://blogs.wankuma.com/madoka/archive/2007/10/18/102814.aspx</guid><wfw:comment>http://blogs.wankuma.com/madoka/comments/102814.aspx</wfw:comment><comments>http://blogs.wankuma.com/madoka/archive/2007/10/18/102814.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/madoka/comments/commentRss/102814.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/madoka/services/trackbacks/102814.aspx</trackback:ping><description>&lt;P&gt;サービスインスタンスの作成と破棄がクライアント主体なもんだから、&lt;BR&gt;サービス側で例外等で自滅するのがやりにくい。。。&lt;/P&gt;
&lt;P&gt;業務要求上、ホストそのものを止めるわけにもいかんし。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/madoka/aggbug/102814.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まどか</dc:creator><title>FaultException</title><link>http://blogs.wankuma.com/madoka/archive/2007/10/10/101097.aspx</link><pubDate>Wed, 10 Oct 2007 17:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/madoka/archive/2007/10/10/101097.aspx</guid><wfw:comment>http://blogs.wankuma.com/madoka/comments/101097.aspx</wfw:comment><comments>http://blogs.wankuma.com/madoka/archive/2007/10/10/101097.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/madoka/comments/commentRss/101097.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/madoka/services/trackbacks/101097.aspx</trackback:ping><description>&lt;P&gt;ThrowするのにInnerExceptionを設定したいのだが。&lt;/P&gt;
&lt;P&gt;コンストラクタに無いのだが。&lt;/P&gt;
&lt;P&gt;InnerExceptionプロパティはReadOnlyなのだが。&lt;/P&gt;
&lt;P&gt;あきらめました。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/madoka/aggbug/101097.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>