2012-02-20 28 views
0

我通過消息總線擴展WCF傳輸,請求 - 答覆模式對我來說效果很好。當我實現輸入輸出模式時,遇到了一個問題。情況是:如果它是IsOneWay = true,則不會調用WCF服務代碼

1,我創建了InputChannel和OutputChannel,並讓TransportBindingElement返回它們。

2,我創建了一個契約接口,它有兩種方法。一個具有IsOneWay = true的屬性,假設它是Method1;另一個不是名爲Method2的。 3,如果我調用Method1,我可以看到它給了我一個RequestChannel和ReplyChannel,而不是InputChannel和OutputChannel。回覆通道可以接收WCF消息並返回RequestContext。但服務代碼未被調用。

4,如果我在Method1上設置了IsOneWay = false,它工作得很好。

4,如果我調用了Method2,它運行良好。

5,我創建了另一個服務合約,它只有一個IsOneWay = true的方法。如果我調用了這個方法,WCF給了我InputChannel和OutputChannel,並且它運行良好(服務代碼執行)。所以我的問題是: 1,如果我有一個與IsOneWay = true方法和IsOneWay = false方法的服務,WCF會給我請求 - 回覆通道,這是正確的嗎?

2,我該如何處理服務調用,該方法是IsOneWay = true,但在同一服務合約中也有IsOneWay = false方法?

順便說一句,我注意到,對於IsOneWay = true方法的請求消息,MessageID爲NULL。我爲請求消息設置了新的ID,但沒有運氣,服務代碼仍未被調用。

回答

1

那麼我終於得到了原因和解決方案。

WCF將根據整個服務合同選擇最佳的渠道形狀,而不是您調用的服務操作。因此,如果我與IsOneWay = true和IsOneWay = false方法有服務契約混合,WCF將使用請求回覆模式,因爲它可以涵蓋所有可能的調用。

接下來,當WCF使用請求 - 應答模式處理單向消息時,應答消息將爲空。這意味着在RequestContext.Reply方法中,來自參數的傳入消息爲空。所以我們不能像正常的請求 - 回覆模式那樣處理它(在這種模式下回復消息不應該爲空)。現在我們需要發送一條空白消息給底層的交通工具,以使服務器端過程繼續下去。

而在客戶端,在RequestChannel.Request方法中,我們還應該處理在這種情況下從RequestContext.Reply發送的空白消息。只需返回null即可。

0

在我看來,您有一種解決方案已經可以工作 - 將您的單向操作從您的請求 - 響應操作解耦爲不同的服務合約。

您的操作之間的通信模式差異表明,無論技術上是否可行,您都不應將這些操作暴露在同一服務中。

UPDATE

像你想實現森達那種轉發服務的它從您的評論的聲音?如果是的話,你讀了this

+0

是的,在實踐中,最好的辦法是隻爲請求回覆提供服務,而另一種服務僅限於一種方式。但是你知道我正在實現一個定製的傳輸層,這意味着我最好支持各種服務實現和主機。如果WCF允許用戶在一個服務中有請求回覆和單向請求,我應該支持它,儘管這不是最好的方式。 – 2012-02-20 09:22:10

+0

已更新我的回答 – 2012-02-20 10:07:24

+0

謝謝休,但我沒有實施路由服務。實際上,我試圖擴展WCF以使用企業消息總線作爲傳輸層。因此,我的擴展應該能夠讓開發人員在我的交通工具上運行各種服務。如果可以在一個服務合同中定義IsOneWay = true和false,我必須支持它。我認爲內置傳輸,如HTTP,NET.TCP和MSMQ都應該支持。 – 2012-02-21 01:00:50

相關問題