2009-08-07 8 views
0

現在、リッスンしているTCPソケットとは別のソースからHTTPリクエストを取得するカスタムバインディングをビルドしています。 チャンネルに直接アクセスして開くときに問題はありません。 ただし、WebServiceHostのエンドポイントでバインディングをホストしようとすると問題が発生します。WebServiceHostがカスタムChannelListenerのOnAcceptChannelを呼び出さない

カスタムバインディングのコードのすべての機能にConsole.WriteLine()デバッグメッセージを挿入しました。私のChannelListenerのOnOpen()関数が呼び出されるまで、すべてうまく動作します。その後、ServiceModelはOnAcceptChannel()メソッドを呼び出したくないだけです。例外なし、エラーメッセージなし。それはちょうどそこにぶら下がり、もう私の縛りの他の機能を呼び出さない。私はアプリケーションの出力を以下のコードにコメントしました。

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80")); 
host.AddServiceEndpoint(typeof(MyService), new MyWebHttpBinding(), ""); 
// BINDING CONSTRUCTOR 
// BINDINGELEMENT CONSTRUCTOR 
host.Open(); 
// BINDING: CreateBindingElements (multiple times) 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: CanBuildChannelListener 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: CanBuildChannelListener 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: BuildChannelListener 
// CHANNELLISTENER CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDING: CreateBindingElements (multiple times) 
// CHANNELLISTENER: OnOpen 
// CHANNELLISTENER: OnOpen END (function completes properly. last output) 

あなたの誰もが、私はOnAcceptChannelメソッドが適切に呼び出される私のアプリケーションに変更しなければならないものを知っていますか?

乾杯

+0

WebServiceHostは、RESTスタイルのリクエストに使用されています....多分それは問題ですか?代わりに正規のServiceHostクラスを使用するとどうなりますか? –

+0

バインディング[i]は元のWebHttpBindingのようなRESTスタイル要求に使用する必要があります。 ただし、WebServiceHostをServiceHostに変更しても問題は解決されません。出力はまったく同じです。 – Etan

答えて

1

あなたはChannelListenerメソッドの非同期バージョンへの呼び出しをログに記録していますか?私はServiceHostがOnAcceptChannelの代わりにOnBeginAcceptChannelを通常呼び出すことを覚えているようです。

また、ハンドラをServiceHost.Faultedイベントに添付していますか?それは間違っている可能性があり、必ずホストのオープンの間に外部例外を取得する必要はありません。

+0

あなたは正しいです。メソッドの非同期バージョンへの呼び出しを記録しませんでした。 プロテクトオーバーライドSystem.IAsyncResult OnBeginAcceptChannel(System.TimeSpanタイムアウト、System.AsyncCallbackコールバック、オブジェクト状態){ Console.WriteLine( "CHANNELLISTENER:OnBeginAcceptChannel"); 新しいSystem.NotImplementedException()をスローします。 } これを挿入しましたが、これが表示されます。それにもかかわらず、私はなぜこの例外の報告を受けていないのだろうと思っています。このような例外を手動でスローする必要がありますか?はいの場合は、どこですか? ありがとうございます。 – Etan

+0

例外の問題を解決できました。 VS 2008のCtrl + D、Eでは、System.NotImplementedException()の横にあるチェックボックスを有効にする必要がありました。 – Etan

+0

そこに例外があると、ServiceHostに障害が発生し、その情報が表示されます。残りの部分については、ServiceHostが(リスナだけでなく、チャネル自体にも)依存しているので、すべての非同期呼び出しを実装する方がよいでしょう。 – tomasr

関連する問題