Recepción de llamadas tRFC entrantes en SAP mediante el modelo de servicio WCF
Puede usar el adaptador de Microsoft BizTalk para mySAP Business Suite como un servidor RFC transaccional (tRFC) para recibir llamadas tRFC entrantes de SAP. En el caso de los TRFC de entrada, el adaptador de SAP admite varios TRFC en la misma unidad lógica de trabajo (LUW) de SAP.
En las secciones de este tema se proporciona información sobre cómo usar el adaptador como servidor tRFC en el modelo de servicio WCF.
Puede encontrar más información sobre el uso del adaptador de SAP como servidor tRFC en los temas siguientes:
Para obtener información general sobre la compatibilidad con TRFC en el adaptador de SAP, consulte Operaciones en TRFC en SAP. Debe leer este tema antes de continuar.
Para obtener más información sobre los esquemas de mensajes para las operaciones del servidor tRFC, consulte Operaciones en TRFC en SAP.
Contrato de servicio WCF para un tRFC
Use el complemento Agregar referencia del servicio adaptador de Visual Studio o la Herramienta de utilidad de metadatos serviceModel (svcutil.exe) para generar un contrato de servicio WCF para los TRFC que desea recibir del sistema SAP. El contrato generado para un tRFC de entrada es similar al generado para una RFC entrante, excepto por lo siguiente:
Las operaciones tRFC se muestran en el nodo TRFC.
El contrato de servicio WCF (interfaz) generado para los TRFC entrantes se denomina "Trfc". Debe especificar esta interfaz al agregar el punto de conexión de servicio al host de servicio. También es la interfaz que el servicio WCF debe implementar.
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); }
El contrato de mensaje de solicitud para las operaciones TRFC tiene un parámetro GUID. Este es el GUID que se asigna a la TID de SAP para tRFC. En las operaciones del servidor tRFC, el adaptador administra todas las llamadas para confirmar, revertir y confirmar el TID por el sistema SAP, por lo que no hay ninguna razón para que use explícitamente este GUID. Sin embargo, puede usarlo para recuperar el TID de SAP del adaptador de SAP mediante una llamada a SapAdapterUtilities.ConvertGuidToTid. Esto puede ser útil para ayudarle a solucionar problemas en el sistema 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; } }
Cómo ¿Habilitar el adaptador para que actúe como servidor tRFC?
Para permitir que el adaptador actúe como un servidor tRFC, debe establecer la propiedad de enlace TidDatabaseConnectionString en el cadena de conexión de la base de datos DE TID. Debe hacerlo antes de abrir el host de servicio. Esta es la base de datos en la que el adaptador almacena el identificador de transacción de SAP (TID) para cada tRFC. Para obtener más información sobre esta propiedad de enlace, vea Leer sobre el adaptador de BizTalk para las propiedades de enlace de mySAP Business Suite.
Cómo Enlist in the Transaction for Inbound tRFCs?
Una unidad lógica de trabajo (LUW) de SAP puede contener varios TRFC. En el sistema SAP, un LUW se identifica mediante un identificador de transacción único (TID). El adaptador crea una transacción confirmable para cada uno de los TID que usa el sistema SAP cuando invoca llamadas tRFC en el adaptador. Cuando el sistema SAP invoca un tRFC en el adaptador; el adaptador fluye la transacción asociada con el TID de SAP al servicio. Puede acceder a esta transacción como transacción ambiente desde dentro del método de operación. Al inscribirse en esta transacción ambiental, las acciones realizadas en la operación pueden participar en el LUW de SAP.
Para inscribirse en la transacción ambiente en un método de operación, debe hacer lo siguiente:
Anote el método de operación con la propiedad TransactionScopeRequired del atributo OperationBehavior . Esto indica a WCF que desea acceder a la transacción ambiente desde dentro de la operación.
Cree un ámbito de transacción anotando el método de operación con la propiedad TransactionAutoComplete del atributo OperationBehavior o usando explícitamente un TransactionScope dentro del método de operación.
En el ejemplo siguiente se muestra un servicio que implementa dos operaciones. Ambos métodos de operación se anotan con la propiedad TransactionScopeRequired para acceder a la transacción ambiente.
Z_TRFC_EXAMPLE1 inscribe explícitamente en la transacción mediante un objeto TransactionScope .
Z_TRFC_EXAMPLE2 se anota con la propiedad TransactionAutoComplete que se va a inscribir en la transacción
[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.
}
}