WCF 配接器的已知問題
本主題描述隨附于 BizTalk Server 的 WCF 配接器已知問題。
在輸入 SOAP 封送處理中失敗的訊息未在 WCF 接收配接器中遭擱置
當訊息抵達 WCF 接收配接器時,WCF 配接器會從內送 SOAP 訊息建立 BizTalk 訊息,然後將 BizTalk 訊息傳遞給結束點管理員管理的傳輸 Proxy。 如果配接器在建立 BizTalk 訊息時無法讀取 SOAP 信封和內文,訊息不會遭擱置,因為配接器使用快速、非快取的順向讀取器來存取 SOAP 訊息。
請查看事件日誌中的失敗訊息。 例如,您可以在 WCF 配接器傳輸屬性對話方塊的 [ 訊息 ] 索引標籤上使用本文路徑運算式,以指定如何從透過 WCF 配接器傳入的 SOAP 訊息內文建立輸入 BizTalk 訊息本文。 當傳入 SOAP 訊息的本文路徑運算式在 [ 訊息 ] 索引標籤上提供時,配接器無法建立 BizTalk 訊息,且無法暫停傳入訊息。 如需如何在 [ 訊息 ] 索引標籤上使用本文路徑運算式的詳細資訊,請參閱 指定 WCF 配接器的訊息本文。
下圖顯示 [ 訊息] 索引標籤,您可以在其中指定如何從傳入 SOAP 訊息建立輸入 BizTalk 訊息。
在輸入 SOAP 封送處理中失敗的訊息未在 WCF 傳送配接器中遭擱置
請求-回應 WCF 傳送埠可接收 WCF 訊息做為回應訊息。 當訊息抵達 WCF 傳送配接器時,WCF 配接器會從內送 SOAP 訊息建立 BizTalk 訊息,然後將 BizTalk 訊息傳遞給結束點管理員管理的傳輸 Proxy。 如果配接器在建立 BizTalk 訊息時無法讀取 SOAP 信封和內文,訊息不會遭擱置,因為配接器使用快速、非快取的順向讀取器來存取 SOAP 訊息。
請查看事件日誌中的失敗訊息。 例如,您可以在 WCF 配接器傳輸屬性對話方塊的 [ 訊息 ] 索引標籤上使用 XPath 運算式,以指定如何從透過 WCF 配接器傳入的 SOAP 訊息內文建立輸入 BizTalk 訊息本文。 當傳入 SOAP 訊息的 XPath 運算式在 [ 訊息 ] 索引標籤上提供時,配接器無法建立 BizTalk 訊息,且無法暫停傳入訊息。 如需如何在 [ 訊息 ] 索引標籤上使用 XPath 運算式的詳細資訊,請參閱 指定 WCF 配接器的訊息本文。
下圖顯示 WCF-NetNamedPipe 傳送配接器的 [ 訊息 ] 索引標籤,例如。
器
在非交易式 WCF 接受位置使用自訂繫結的雙向傳輸中若使用 OneWayBindingElement 時,訊息可能會遺失
在雙向通訊中,WCF 配接器會傳回回應,直到訊息保存在 MessageBox 資料庫中。 不過,使用 OneWayBindingElement 會在將收到的訊息分派給 WCF 配接器之前立即產生虛擬回應。 因此,如果您在通道堆疊中使用 OneWayBindingElement 設定自訂系結,以便在非交易式接收位置進行雙向傳輸,訊息可能會遺失,因為 WCF 配接器會以單向方式處理接收的訊息。
建構繫結時,會使用 WCF-Custom 和 WCF-CustomIsolated 傳輸屬性對話方塊中的 ReaderQuotas 屬性預設值
在 [WCF-Custom 和 WCF-CustomIsolated 傳輸屬性] 對話方塊中, ReaderQuotas 屬性值會顯示為零。 不過,當建構繫結時,會使用下列值:
屬性 | 描述 | 值 |
---|---|---|
maxArrayLength | 指定陣列長度上限的正整數。 | 16384 |
maxBytesPerRead | 指定每次讀取作業傳回的位元組上限的正整數。 | 4096 |
maxDepth | 指定每次讀取的巢狀節點深度上限的正整數。 | 32 |
maxNameTableCharCount | 指定資料表名稱的字元數上限的正整數。 | 16384 |
maxStringContentLength | 指定 XML 項目內容的字元數上限的正整數。 | 8192 |
如果變更 WCF 配接器類型但位址保持不變,則 WCF 接收位置可能會停用
如果您變更配接器類型,例如,將 WCF 配接器類型從 WCF-NetTcp 變更為包含 NetTcp 繫結的 WCF-Custom,而位址保持不變,則接收位置可能會停用,因為結束點管理員會發生快取問題。 若要解決這個問題,您可以執行下列任一種方法:
重新啟動 BTSNTSvc 服務。
將 URI 變更為不同的位址並儲存,然後將 URI 變更回原來的位址,再儲存一次。
協調流程中設定的 WCF 動作不會覆寫靜態傳送埠中的動作設定
如果您設定 WCF。 協調流程中的動作內容屬性,您必須在 [WCF 配接器傳輸屬性] 對話方塊中保留 [ 動作 ] 欄位空白。 如果您也會在靜態傳送埠中指定動作, 則 WCF。 您在協調流程中設定的動作內容屬性將會由您在靜態傳送埠中設定的值覆寫。
交易式傳送中不支援傳播錯誤訊息
要求-回應傳送埠中的 [ 傳播錯誤訊息 ] 選項可讓您將輸出處理失敗的訊息路由傳送至訂閱應用程式。 不過,如果在傳輸屬性對話方塊中也選取 [ 啟用交易 ] 核取方塊,而且當錯誤回應送達配接器時,交易已中止或無法使用,您將無法將錯誤訊息傳播至任何訂閱應用程式
叢集容錯移轉期間,需要先重新啟動 MSMQ 叢集資源群組,才能重新啟動 BizTalk 主控件叢集資源群組
在容錯移轉叢集的情況中,如果發生容錯移轉,需要先重新啟動 MSMQ 叢集資源群組,才能重新啟動 BizTalk 主控件叢集資源群組。 如果未能這麼做,MSMQ 接收位置可能會停用。 若要解決這個問題,您可以設定 BizTalk 主控件叢集資源群組相依於 MSMQ 叢集資源群組,以確保 MSMQ 叢集資源群組會在 BizTalk 主控件叢集資源群組之前先行啟動。 或者,您也可以重新啟動 BizTalk 主控件叢集資源群組來解決這個問題。
將訊息傳送到在結束點中使用 wsFederationHttpBinding 的 WCF 服務時,收到錯誤
您收到類似下面的錯誤:
The adapter failed to transmit message going to send port "MySendPort" with URL "http://localohost/MywsFedHttp". It will be retransmitted after the retry interval specified for this Send Port. Details:"The channel is configured to use interactive initializer 'System.ServiceModel.Security.InfocardInteractiveChannelInitializer', but the channel was Opened without calling DisplayInitializationUI. Call DisplayInitializationUI before calling Open or other methods on this channel.".
此行為是設計所致。 WCF 配接器無法將訊息傳送至在其端點中使用 wsFederationHttpBinding 的 WCF 服務。
BizTalk WCF 服務使用精靈無法讓您從 WSDL 選取訊息類型或連接埠類型
匯入 WCF 服務時,BizTalk WCF 服務使用精靈無法讓您從 WSDL 選取訊息類型或連接埠類型。 若要解除此限制,您可以使用下列程式碼取得結構描述,然後將所需的結構描述加入到您的 BizTalk 專案:
svcutil.exe /t:metadata http://service/metadataendpoint
BizTalk WCF 服務使用精靈不允許單向與要求-回應的組合作業
BizTalk WCF 服務使用精靈不允許您匯入有單向與要求-回應組合作業的連接埠類型。 若要解決這個問題,您可以使用 ServiceModel 中繼資料公用程式工具來產生連接埠類型。
擷取 WSDL 時,BizTalk WCF 服務使用精靈不允許您設定憑證認證
擷取 WSDL 時,BizTalk WCF 服務使用精靈不允許您設定憑證認證。 若要解決此問題,您可以使用 ServiceModel 中繼資料公用程式工具,從您想要使用 svcutil.exe.config 檔案中憑證認證的 WCF 服務產生 WSDL 和 XSD 檔案,然後在 [中繼資料來源] 頁面中選擇 [中繼資料檔案] (WSDL 和 XSD) 選項,將它們匯入 BizTalk WCF 服務取用精靈。
WCF 配接器不支援單向作業
當使用 WCF 配接器發行的 WCF 服務時 (,除了在用戶端將 IsOneWay 屬性設定為 true ,WCF-NetMsmq 接收) 配接器以外,您會收到類似下列的錯誤訊息。 這是因為與 WCF 配接器一起發行之 WCF 服務的 System.ServiceModel.OperationContractAttribute.IsOneWay 屬性 (,除了以 WCF-NetMsmq 接收配接器發行的服務,) 即使單向接收位置也設定為 false 。
The channel received an unexpected input message while closing. Your Channel.Close() calls are not synchronized.
當您使用 IsOneWay 屬性所指定的 WCF 服務設定為 true時,您會收到類似下列的錯誤訊息。 您從BizTalk Server傳送的訊息將會暫停並繼續。
The request operation at net.tcp://localhost:8088/MyService/tcp did not receive a reply within timeout 00:01:00.
使用 WCF-NetMsmq 繫結傳送訊息到非交易式 MSMQ 佇列時,可能會發生記憶體遺漏
使用 WCF-NetMsmq 繫結傳送訊息到非交易式 MSMQ 佇列時,BizTalk NT 服務可能會發生記憶體遺漏。 當您使用 WCF-NetMsmq 傳輸傳送訊息到非交易式 MSMQ 佇列,或使用包含 WCF-Custom 傳輸的 netMsmqBinding 傳送訊息到非交易式 MSMQ 佇列時,就可能會發生這種情況。
若要解決此問題,您必須在 936512 一文 https://go.microsoft.com/fwlink/?LinkId=92962 中所述安裝 .NET Framework 3.0 Hotfix。 Hotfix 不需要系統重新開機,但需要重新啟動裝載使用 WCF-NetMsmq 繫結之傳送埠的 BizTalk NT 服務。
使用 WCF-BasicHttp 配接器與 Apache Web 伺服器通訊時,可能會收到例外狀況
當您使用包含傳輸安全性的 WCF-BasicHttp 配接器與 Apache Web 伺服器通訊時,可能會收到類似下面的例外狀況:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
若要解決這個問題,您需要使用 WCF-Custom 配接器 (而非 WCF-BasicHttp 配接器) 來與 Apache Web 伺服器通訊,如下所示:
建立傳送埠,並將傳輸類型設定為 WCF-Custom。
在[WCF-自訂傳輸屬性] 對話方塊的 [系結] 索引標籤上,從 [系結類型] 下拉式清單中選取customBinding。
在 CustomeBindingElement下,以滑鼠右鍵按一下 HTTPTransport,然後按一下 [ 移除延伸模組]。
以滑鼠右鍵按一下 CustomeBindingElement,然後按一下 [ 新增擴充功能]。
在 [ 選取繫結項目延伸 模組] 對話方塊中,選取 [HTTPTransport ],然後按一下 [ 確定]。
按一下 [HTTPTransport],然後在 [ 組態 ] 窗格中,將 keepAliveEnabled 的值設定為 False。
按一下 textMessageEncoding,然後在 [ 組態 ] 窗格中,將 messageVersion 的值設定為
Soap11WSAddressing10
。您可能需要視情況設定其他屬性。
BizTalk Server 無法與使用 ClientViaBehavior 進行多躍點交談的 WCF 用戶端搭配運作
當直接網路目的地不是訊息的預定處理器,WCF 用戶端會使用 ClientViaBehavior 來啟用多躍點交談,在這種情況下,呼叫應用程式不一定知道最終的目的地為何。 如果您指定 ClientViaBehavior 並將收件人位址設定為遠端服務,其中 BizTalk Server 將做為中介者,那麼就會收到類似下面的錯誤訊息:
The message with To 'net.tcp://localhost:5555/test.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree