/// <summary> /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. /// </summary> public static async Task <PlayFabResult <ExecuteFunctionResult> > ExecuteFunctionAsync(ExecuteFunctionRequest request, object customData = null, Dictionary <string, string> extraHeaders = null) { await new PlayFabUtil.SynchronizationContextRemover(); var requestContext = request?.AuthenticationContext ?? PlayFabSettings.staticPlayer; var requestSettings = PlayFabSettings.staticSettings; if (requestContext.EntityToken == null) { throw new PlayFabException(PlayFabExceptionCode.EntityTokenNotSet, "Must call Client Login or GetEntityToken before calling this method"); } string localApiServerString = PlayFabSettings.LocalApiServer; if (!string.IsNullOrEmpty(localApiServerString)) { var baseUri = new System.Uri(localApiServerString); var fullUri = new System.Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/')); // Duplicate code necessary to avoid changing all SDK methods to new convention var debugHttpResult = await PlayFabHttp.DoPostWithFullUri(fullUri.AbsoluteUri, request, "X-EntityToken", requestContext.EntityToken, extraHeaders); if (debugHttpResult is PlayFabError debugError) { PlayFabSettings.GlobalErrorHandler?.Invoke(debugError); return(new PlayFabResult <ExecuteFunctionResult> { Error = debugError, CustomData = customData }); } var debugResultRawJson = (string)debugHttpResult; var debugResultData = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <ExecuteFunctionResult> >(debugResultRawJson); var debugResult = debugResultData.data; return(new PlayFabResult <ExecuteFunctionResult> { Result = debugResult, CustomData = customData }); } var httpResult = await PlayFabHttp.DoPost("/CloudScript/ExecuteFunction", request, "X-EntityToken", requestContext.EntityToken, extraHeaders); if (httpResult is PlayFabError) { var error = (PlayFabError)httpResult; PlayFabSettings.GlobalErrorHandler?.Invoke(error); return(new PlayFabResult <ExecuteFunctionResult> { Error = error, CustomData = customData }); } var resultRawJson = (string)httpResult; var resultData = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <ExecuteFunctionResult> >(resultRawJson); var result = resultData.data; return(new PlayFabResult <ExecuteFunctionResult> { Result = result, CustomData = customData }); }