Table of Contents

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);

}