2009-08-07 37 views
0

我目前正在構建一個自定義綁定,它從不同的來源獲取HTTP請求,而不是來自偵聽的TCP套接字。 當我直接訪問並打開一個頻道時,沒有問題。 但是,當我嘗試在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類呢? – 2009-08-07 09:49:04

+0

綁定[i]應該用於像原始WebHttpBinding那樣的REST樣式請求。 但是,將WebServiceHost更改爲ServiceHost並不能解決問題。輸出完全一樣。 – Etan 2009-08-07 10:01:39

回答

1

你記錄到的ChannelListener方法的異步版本電話?我似乎記得ServiceHost試圖正常調用OnBeginAcceptChannel而不是OnAcceptChannel。

另外,你是否將一個處理程序附加到ServiceHost.Faulted事件?這可能是因爲它是錯誤的,並且在主持人開放期間你不一定會得到一個外部異常。

+0

你說得對。沒有將調用記錄到方法的異步版本。 保護覆蓋System.IAsyncResult OnBeginAcceptChannel(System.TimeSpan超時,System.AsyncCallback回調,對象狀態)Console.WriteLine(「CHANNELLISTENER:OnBeginAcceptChannel」); throw new System.NotImplementedException(); } 我已經插入這一個,現在它出現了。不過,我想知道爲什麼我沒有收到這個例外的報告。我是否必須手動啓用這種例外情況?如果是,那麼在哪裏? 非常感謝您的回答! – Etan 2009-08-07 13:47:40

+0

可以解決異常問題。在VS 2008的Ctrl + D,E下,我必須激活System.NotImplementedException()旁邊的複選框。 – Etan 2009-08-07 13:57:15

+0

這裏的任何異常都會導致ServiceHost出錯,這就是你看到這些信息的地方。至於其他的,嗯,是的,你最好實施所有的異步調用,因爲ServiceHost依賴於它們(不僅在監聽器上,而且在通道本身上)。 – tomasr 2009-08-07 14:07:29

相關問題