Webservice Callback-Funktionen
Informationen
- Kategorien: Kernel | Webservice (Server)
- Version: 17.0.0.5715
- Veröffentlichungsdatum: Freitag, 3. Januar 2014
- Entwickler: Schulze
- Benötigt Datenbankänderung: Nein
- Betreff: Rückfrage an den aufrufenden Webservice-Client innerhalb eines Webservice-Funktionsaufrufes
Beschreibung
Es gab Anforderungen, innerhalb einer Klassenformel bzw. Systemfunktion, welche aufgrund eines Aufruf einer Webservice-Funktion durchlaufen wird, Rückfragen an den Client stellen zu können. Im UI-Modus wird das durch MessageBox und Co.erledigt. Diese Funktionen können im Service-Modus nicht aufgerufen werden.
Deshalb wurden jetzt 2 neue Funktionen zur Verfügung gestellt: WSClientCallbackMsgBoxQuery und WSClientCallbackGenericQuery.
Mit diesen Funktionen kann der Webservice innerhalb einer Klassenformel oder Systemfunktion eine Rückfrage an den aufrufenden Webservice-Client stellen.
Der Aufruf dieser CallbackQuery-Funktion generiert innerhalb einer Abarbeitung einer beliebigen Webservicefunktion eine Webservice-Fault (PitFM.Web.Service.CallbackQueryPendingFault). Voraussetzung ist das innerhalb des Webservice-Aufrufs eine Klassenformel oder Systemfunktion durchlaufen wird in welcher dann die CallbackQuery-Funktion aufgerufen werden kann.
Die Fault teilt dem Webservice-Client mit dass der Webservice eine Rückfrage (CallbackQuery) gestellt hat. Die Daten der CallbackQuery werden in der Fault mitgegeben.
Der Webservice-Client muss durch einen Aufruf der Webservicefunktion ClientCallback_SetCurrentQuery auf diese Fault reagieren, damit die Antwortdaten auf diese CallbackQuery zurück an den Webservice gesendet werden.
Danach muss der Webservice-Client die ursprüngliche Webservice-Funktion in der die Fault auftrat noch einmal aufrufen damit die Antwortdaten der ursprünglich aufgerufenen Webservicefunktion empfangen werden können.
Beispielcode
///////////////////////////////////
// Klassenformel/Systemfunktion
//
safe function string TestCallback( string $s )
{
var int $nResult;
$nResult = 0;
WSClientCallbackGenericQuery( 100, "TestCallback", $nResult, "Der Text wurde übergeben:\n'" + $s + "'\nIst das gut?" );
Trace( "$nResult=%1", $nResult );
if ( !$nResult )
{
return "Schade";
}
return "Freut mich :)";
}
///////////////////////////////////
// C# Webservice-Client
//
public static void ExecuteTest(pitfmWcfClient.WsProxy.ModelClient svc, string sSessionId)
{
object[] vParams = new object[1];
vParams[0] = "Das ist ein Test.";
bool bCallWebserviceFunction = false;
do
{
try
{
// Die User-Defined Funktion erwartet einen String-Parameter und gibt einen String zurück
//
object vResult = svc.CallUserDefinedSafeFunction(sSessionId, "TestCallback", vParams);
bCallWebserviceFunction = false;
// Rückgabewert ausgeben
//
TraceText(vResult.ToString());
}
catch (System.ServiceModel.FaultException<pitfmWcfClient.WsProxy.CallbackQueryPendingFault> fault)
{
// Die Callback-Query wird in der Fault mitgegeben.
//
pitfmWcfClient.WsProxy.ClientCallbackQuery query = fault.Detail.QueryObject;
pitfmWcfClient.WsProxy.ClientCallbackGenericQuery genericQuery = null;
if (query.QueryTypeId == 1000)
{
genericQuery = fault.Detail.QueryObject as pitfmWcfClient.WsProxy.ClientCallbackGenericQuery;
}
// else if (query.QueryTypeId == 1)
// {
// pitfmWcfClient.WsProxy.ClientCallbackMessageBoxQuery messageboxQuery = fault.Detail.QueryObject as pitfmWcfClient.WsProxy.ClientCallbackMessageBoxQuery;
// }
// Die Beispiel-Funktion übergibt einen String-Parameter
// und erwartet als Rückgabewert einen Boolschen Wert.
//
// Den Parameter anzeigen
//
TraceText(genericQuery.CallbackParameters[0].ToString());
// Auf den User-Input warten.
// Beispiel: wenn der User 'n' eingibt wird false zurückgegeben, sonst true
//
if (GetUserInput() == "n")
{
genericQuery.CallbackResult = false;
}
else
{
genericQuery.CallbackResult = true;
}
// Vor dem Übergeben der Callback-Antwort können optional auch noch andere Webservice-Funktionen aufgerufen werden
//
svc.SetCurrentClientCallbackQueryAnswer(sSessionId, genericQuery);
// Die ursprüngliche Webservice-Funktion muss noch einmal aufgerufen werden damit der Rückgabewert übernommen werden kann.
// Die Aufrufparameter werden an dieser Stelle vom Webservice nicht mehr beachtet.
//
bCallWebserviceFunction = true;
}
}
while (bCallWebserviceFunction);
}