使用 WCF 服務模型在 SAP 中接收輸入 tRFC 呼叫
您可以使用 Microsoft BizTalk Adapter for mySAP Business Suite 作為交易式 RFC (tRFC) 伺服器,以接收來自 SAP 的輸入 tRFC 呼叫。 針對輸入 tRFC,SAP 配接器支援相同 SAP 邏輯單元中的多個 tRFC (LUW) 。
本主題中的各節提供如何在 WCF 服務模型中將配接器當做 tRFC 伺服器使用的資訊。
您可以在下列主題中找到有關使用 SAP 配接器作為 tRFC 伺服器的詳細資訊:
如需 SAP 配接器上 tRFC 支援的概觀,請參閱 SAP 中 tRFC 上的作業。 您應該先閱讀本主題,再繼續進行。
如需 tRFC 伺服器作業之訊息架構的詳細資訊,請參閱 SAP 中 tRFC 上的作業。
tRFC 的 WCF 服務合約
您可以使用新增配接器服務參考 Visual Studio 外掛程式或 ServiceModel 中繼資料公用程式工具 (svcutil.exe) ,為您想要從 SAP 系統接收的 TRFC 產生 WCF 服務合約。 針對輸入 tRFC 產生的合約類似于針對輸入 RFC 產生的合約,不同之處在于:
tRFC 作業會顯示在 TRFC 節點底下。
針對傳入 tRFC 產生的 WCF 服務合約 (介面) 名為 「Trfc」。 當您將服務端點新增至服務主機時,必須指定此介面。 這也是 WCF 服務必須實作的介面。
public interface Trfc { // CODEGEN: Generating message contract since the wrapper namespace (http://Microsoft.LobServices.Sap/2007/03/Trfc/) of message Z_RFC_MKD_ADDRequest does not match the default value (http://Microsoft.LobServices.Sap/2007/03/) [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.LobServices.Sap/2007/03/Trfc/Z_RFC_MKD_ADD", ReplyAction="http://Microsoft.LobServices.Sap/2007/03/Trfc/Z_RFC_MKD_ADD/response")] Z_RFC_MKD_ADDResponse Z_RFC_MKD_ADD(Z_RFC_MKD_ADDRequest request); }
TRFC 作業的要求訊息合約具有 GUID 參數。 這是對應至 tRFC SAP TID 的 GUID。 在 tRFC 伺服器作業中,配接器會管理 SAP 系統認可、復原和確認 TID 的所有呼叫,因此您沒有理由明確地使用此 GUID。 不過,您可以藉由呼叫 SapAdapterUtilities.ConvertGuidToTid,使用它從 SAP 配接器擷取 SAP TID。 這有助於針對 SAP 系統上的問題進行疑難排解。
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.MessageContractAttribute(WrapperName="Z_RFC_MKD_ADD", WrapperNamespace="http://Microsoft.LobServices.Sap/2007/03/Trfc/", IsWrapped=true)] public partial class Z_RFC_MKD_ADDRequest { ... public Z_RFC_MKD_ADDRequest(string DEST, System.Nullable<int> X, System.Nullable<int> Y, System.Guid TransactionalRfcOperationIdentifier) { this.DEST = DEST; this.X = X; this.Y = Y; this.TransactionalRfcOperationIdentifier = TransactionalRfcOperationIdentifier; } }
如何?啟用配接器作為 tRFC 伺服器?
若要讓配接器做為 tRFC 伺服器,您必須將TidDatabaseConnectionString系結屬性設定為 TID 資料庫的 連接字串。 您應該在開啟服務主機之前執行此動作。 這是配接器針對每個 tRFC 儲存 SAP 交易識別碼 (TID) 的資料庫。 For more information about this binding property, see Read about BizTalk Adapter for mySAP Business Suite Binding Properties.
如何?輸入 TRFC 的交易中登記?
(LUW) 的 SAP 邏輯單位可以包含多個 TRFC。 在 SAP 系統上,LUW 是由唯一的交易識別碼 (TID) 來識別。 配接器會針對 SAP 系統在配接器上叫用 tRFC 呼叫時所使用的每個 TID 建立可認可的交易。 當 SAP 系統在配接器上叫用 tRFC 時;配接器會將與 SAP TID 相關聯的交易流向您的服務。 您可以從作業方法記憶體取此交易作為環境交易。 藉由在此環境交易中登記,在作業中執行的動作可以參與 SAP LUW。
若要在作業方法的環境交易中登記,您必須:
使用OperationBehavior屬性的TransactionScopeRequired屬性標注 operation 方法。 這會告訴 WCF 您想要從作業內部存取環境交易。
使用OperationBehavior屬性的TransactionAutoComplete屬性標注作業方法,或在作業方法內明確使用TransactionScope來建立交易範圍。
下列範例顯示實作兩項作業的服務。 這兩個作業方法都會以 TransactionScopeRequired 屬性標注,以存取環境交易。
Z_TRFC_EXAMPLE1 使用 TransactionScope 物件明確登記交易中。
Z_TRFC_EXAMPLE2 會以 TransactionAutoComplete 屬性標注,以在交易中登記
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
class Z_Example_ServiceContractClass : Trfc
{
// This operation method explicitly creates a TransactionScope to enlist in the ambient transaction
// You must explictly call ts.Complete to complete the transaction before you return from the operation
// Otherwise the transaction is aborted.
// You can throw an exception or return without calling ts.complete to abort the transacation
[OperationBehavior(TransactionScopeRequired = true)]
public Z_TRFC_EXAMPLE1Response Z_TRFC_EXAMPLE1(Z_TRFC_EXAMPLE1Request request)
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
// Process tRFC
...
Z_TRFC_EXAMPLE1Response response = new Z_TRFC_EXAMPLE1Response();
response.TransactionalRfcOperationIdentifier = request.TransactionalRfcOperationIdentifier;
return response;
//since there is no ts.Complete(), this is equivalent to a rollback.
}
}
// This operation method sets the TransactionAutoComplete property of the OperationBehavior attribute
// to enlist in the transaction. There is no need to explictly create a TransactionScope in the code.
// If the method returns with no unhandled exceptions, the transaction completes; otherwise it aborts
// You can throw an exception to abort the transaction.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public Z_TRFC_EXAMPLE2Response Z_TRFC_EXAMPLE2(Z_TRFC_EXAMPLE2Request request)
{
// Process tRFC
...
Z_TRFC_EXAMPLE2Response response = new Z_TRFC_EXAMPLE2Response();
response.TransactionalRfcOperationIdentifier = request.TransactionalRfcOperationIdentifier;
return response;
//if there is no unhandled exception, the transaction completes when the operation returns.
}
}