> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Guide de démarrage rapide de PlayFab CloudScript avec Azure Functions

> Écrivez du PlayFab CloudScript avec Azure Functions en C# à l'aide de Visual Studio Code et d'Unity, puis liez les fonctions à des règles, des tâches planifiées ou des appels clients.

# Démarrage rapide : écriture d'un PlayFab CloudScript avec Azure Functions

Dans ce démarrage rapide, vous allez écrire un CloudScript avec Azure Functions à l'aide de Visual Studio Code, d'Azure Functions en C# et d'Unity en C#. À la fin de ce guide, vous pourrez lier votre nouveau CloudScript à des règles ou à des tâches planifiées, ou même l'appeler depuis votre code client.

## Prérequis

Quelques étapes sont nécessaires pour commencer à utiliser PlayFab CloudScript en C#.

* Consultez le [démarrage rapide : créer un projet Azure Functions à l'aide de Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp) de Visual Studio Code et revenez ici une fois la configuration terminée. Les prérequis suivants sont couverts dans ce guide de démarrage rapide :
  * Un [compte Azure](https://azure.microsoft.com/free). L'inscription à un compte Azure est gratuite
  * Un [abonnement Azure](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription)
  * Une ressource Functions App configurée dans le portail Azure
    * Pour réduire la latence de votre CloudScript avec Azure Functions, placez vos fonctions dans les régions Azure *US-West*, *US-West 2* ou *US-West 3*.
    * **Remarque de sécurité :** du point de vue de la sécurité, veillez à n'utiliser un secret de fonction donné qu'avec PlayFab, et non pour appeler la même fonction depuis une autre source.
    * **Remarque de sécurité :** pour les fonctions en file d'attente, configurez un compte de stockage distinct pour les files d'attente utilisées par le déclencheur de file d'attente.
* Un compte [PlayFab](https://developer.playfab.com/).

> [!NOTE]
>
> Les Azure Functions PlayFab peuvent utiliser le runtime Azure Functions V2 ou ultérieur, ainsi que .NET Core 2 ou ultérieur. Nous vous recommandons d'utiliser la dernière version (actuellement Azure Functions V4 et .NET 6).

## Créer une Azure Function

1. Créez un exemple de fonction « HelloWorld » de base. Pour savoir comment procéder, suivez le guide [Créer votre première fonction à l'aide de Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code). Pour un exemple de code utilisant des variables PlayFab, consultez la section [Contexte de fonction PlayFab, variables et utilisation des SDK serveur](#playfabfunctioncontext).

> [!NOTE]
>
> Le guide « Créer votre première fonction à l'aide de Visual Studio Code » vous demande de définir le niveau d'autorisation de votre Azure Function sur `Anonymous`. Cela permet de simplifier les tests. Dans un environnement de production, vous ne devriez généralement pas utiliser l'autorisation Anonymous, car elle permet à n'importe qui d'appeler le point de terminaison de votre fonction. Pour sécuriser correctement votre fonction dans l'environnement PlayFab, nous vous recommandons d'utiliser l'autorisation de niveau `Function`.

2. Après avoir créé et déployé votre fonction, accédez à **Automation** > **Cloud Script**, puis sélectionnez le bouton **Register Function** dans le coin supérieur droit de la page.

   ![Inscrire une fonction CloudScript](https://mintcdn.com/microsoft-4404708b/dqv53299jA1M-fNi/images/playfab/live-service-management/service-gateway/automation/cloudscript-af/register_cs_function.png?fit=max\&auto=format\&n=dqv53299jA1M-fNi\&q=85\&s=4bfc5e2c33a1ad384fa01a0698d4cd5d)

3. Pour **Name**, entrez un nom convivial pour votre fonction. Pour **Function URL**, entrez l'URL du déclencheur HTTP de la fonction. Cette URL se trouve dans le menu contextuel de la ressource Azure Function, comme indiqué dans la section « Run the function in Azure » du [démarrage rapide : créer une fonction dans Azure à l'aide de Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp#run-the-function-in-azure). Si votre Azure Function utilise l'autorisation de niveau `Function`, l'URL contient la clé d'autorisation.

Pour plus de renseignements sur le déploiement d'Azure Functions, consultez [Déployer Azure Functions à l'aide de Visual Studio Code](https://learn.microsoft.com/azure/azure-functions/functions-develop-vs-code).

## Utilisation et appel de CloudScript avec Azure Functions depuis votre titre PlayFab

L'exemple de code de ce guide est écrit en C# pour Unity et en C# pour Azure Functions.

Maintenant que votre fonction est inscrite, vous pouvez l'appeler à l'aide des API PlayFab.

### Appel de votre fonction à l'aide de requêtes HTTP depuis Visual Studio Code

À l'aide de l'[extension REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client), vous pouvez appeler la fonction depuis Visual Studio.

```http theme={null}
@titleId =  ????? # Enter your title ID here
@baseUrl = https://{{titleId}}.playfabapi.com

###
# @name LoginWithCustomID
POST {{baseUrl}}/Client/LoginWithCustomID
Accept-Encoding: gzip
Content-Type: application/json

{
  "CustomId": "demo",
  "CreateAccount": true,
  "TitleId": "{{titleId}}"
}

@entityToken = {{LoginWithCustomID.response.body.$.data.EntityToken.EntityToken}}
@entity = {{LoginWithCustomID.response.body.$.data.EntityToken.Entity}}

###
# @name ExecuteFunction
POST {{baseUrl}}/CloudScript/ExecuteFunction
Accept-Encoding: gzip
Content-Type: application/json
X-EntityToken: {{entityToken}}

{
  "FunctionName": "HelloWorld"
}

###
# @name GetObjects
POST {{baseUrl}}/Object/GetObjects
Accept-Encoding: gzip
Content-Type: application/json
X-EntityToken: {{entityToken}}

{
  "Entity": {{entity}},
  "Objects": ["obj1"]
}

```

Après avoir collé ce code dans un fichier Visual Studio Code doté de l'extension .http, vous devriez pouvoir sélectionner *Send request* sous la fonction *LoginWithCustomID* pour obtenir le jeton d'entité d'un joueur, puis sous *LoginWithCustomID* pour appeler votre fonction. L'appel de *GetObjects* doit afficher l'objet que votre Azure Function a attaché au joueur.

### Appel de votre fonction depuis Unity

Vous pouvez utiliser ce code dans Unity pour appeler votre fonction.

```c# theme={null}
//This snippet assumes that your game client is already logged into PlayFab.

using PlayFab;
using PlayFab.CloudScriptModels;

private void CallCSharpExecuteFunction()
{
    PlayFabCloudScriptAPI.ExecuteFunction(new ExecuteFunctionRequest()
    {
        Entity = new PlayFab.CloudScriptModels.EntityKey()
        {
            Id = PlayFabSettings.staticPlayer.EntityId, //Get this from when you logged in,
            Type = PlayFabSettings.staticPlayer.EntityType, //Get this from when you logged in
        },
        FunctionName = "HelloWorld", //This should be the name of your Azure Function that you created.
        FunctionParameter = new Dictionary<string, object>() { { "inputValue", "Test" } }, //This is the data that you would want to pass into your function.
        GeneratePlayStreamEvent = false //Set this to true if you would like this call to show up in PlayStream
    }, (ExecuteFunctionResult result) =>
    {
        if (result.FunctionResultTooLarge ?? false)
        {
            Debug.Log("This can happen if you exceed the limit that can be returned from an Azure Function, See PlayFab Limits Page for details.");
            return;
        }
        Debug.Log($"The {result.FunctionName} function took {result.ExecutionTimeMilliseconds} to complete");
        Debug.Log($"Result: {result.FunctionResult.ToString()}");
    }, (PlayFabError error) =>
    {
        Debug.Log($"Opps Something went wrong: {error.GenerateErrorReport()}");
    });
}

```

### Contexte, variables et SDK serveur de PlayFab CloudScript&#x20;

L'un des avantages de CloudScript avec Azure Functions est que le contexte de l'événement PlayStream et du profil de joueur est automatiquement transmis à l'Azure Function. Lors de l'appel du CloudScript, vous recevez le contexte correspondant au scénario d'appel de la fonction. Par exemple, le contexte varie selon que la fonction est déclenchée par une action PlayStream ou appelée directement depuis le client. Il comprend des informations telles que le profil d'entité pour le compte duquel le CloudScript a été appelé et, éventuellement, les événements PlayStream utilisés pour appeler le CloudScript.

1. Vous devez installer le SDK PlayFab au moyen du gestionnaire de packages. Pour ce faire, ouvrez le terminal ou la console CMD dans Visual Studio Code et tapez : `dotnet add package PlayFabAllSDK`
2. Vous devez inclure le fichier [CS2AFHelperClasses.cs](https://github.com/PlayFab/PlayFab-Samples/blob/master/Samples/CSharp/AzureFunctions/CS2AFHelperClasses.cs), qui contient l'implémentation de `PlayFab.Samples`
3. L'exécution d'un script peut se faire selon plusieurs méthodes (API, tâches planifiées, événement PlayStream, entrée dans un segment et sortie d'un segment). Le contexte d'exécution est important pour implémenter votre CloudScript. Consultez le [tutoriel Utilisation des modèles de contexte CloudScript](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/CloudScript-af-context.md) pour savoir comment utiliser le contexte du script.

Vous pouvez utiliser l'exemple HelloWorld comme première Azure Function. Il appelle une API d'entité et retourne un message d'accueil au joueur authentifié. Les API serveur classiques peuvent être appelées de façon similaire; il faut toutefois spécifier la clé secrète du titre pour effectuer l'appel. La clé secrète peut être stockée dans les [paramètres de l'application](https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#settings) et récupérée à l'aide de la méthode `Environment.GetEnvironmentVariable()`.

```c# theme={null}
using PlayFab;
using PlayFab.Samples;
using PlayFab.DataModels;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace PlayFabCS2AFSample.HelloWorld
{
    public static class HelloWorld
    {
        [FunctionName("HelloWorld")]
        public static async Task<dynamic> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            FunctionExecutionContext<dynamic> context = JsonConvert.DeserializeObject<FunctionExecutionContext<dynamic>>(await req.ReadAsStringAsync());

            dynamic args = context.FunctionArgument;

            var message = $"Hello {context.CallerEntityProfile.Lineage.MasterPlayerAccountId}!";
            log.LogInformation(message);

            dynamic inputValue = null;
            if (args != null && args["inputValue"] != null)
            {
                inputValue = args["inputValue"];
            }

            log.LogDebug($"HelloWorld: {new { input = inputValue} }");

            // The profile of the entity specified in the 'ExecuteEntityCloudScript' request.
            // Defaults to the authenticated entity in the X-EntityToken header.
            var entityProfile = context.CallerEntityProfile;

            var api = new PlayFabDataInstanceAPI(
                new PlayFabApiSettings
                {
                    TitleId = context.TitleAuthenticationContext.Id
                },
                new PlayFabAuthenticationContext
                {
                    EntityToken = context.TitleAuthenticationContext.EntityToken
                }
            );

            var apiResult = await api.SetObjectsAsync(
                new SetObjectsRequest
                {
                    Entity = new EntityKey
                    {
                        Id = entityProfile.Entity.Id,
                        Type = entityProfile.Entity.Type
                    },
                    Objects = new List<SetObject> {
                    new SetObject
                    {
                        ObjectName =  "obj1",
                        DataObject = new
                        {
                            foo = "some server computed value",
                            prop1 = "bar"
                        }
                    }
                }
                });

            return new { messageValue = message };
        }
    }
}
```

Dans l'exemple, le `CurrentPlayerId` de l'appelant est disponible, comme dans notre implémentation CloudScript traditionnelle. Les paramètres que vous transmettez dans le champ `FunctionParameters` sont disponibles dans *args*. Mais, contrairement à l'exemple Hello World du guide [Créer votre première fonction à l'aide de Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp), les paramètres sont transmis dans le corps de la requête POST plutôt que dans la chaîne de requête.

Pour appeler l'Azure Function HelloWorld depuis un SDK PlayFab, utilisez `ExecuteFunction`.

## Azure Functions dans les règles d'automatisation

Les Azure Functions peuvent également être appelées en créant des règles et des tâches planifiées. Le fonctionnement est identique à celui de notre CloudScript standard. Pour créer une règle ou une tâche planifiée, accédez à **Automation** > **Rules** ou à **Automation** > **Scheduled Tasks**.

* Sélectionnez **New Rule**
* Entrez un nom pour votre règle
* Sélectionnez le type d'événement qui déclenche cette règle
* Ajoutez une action
* Dans la liste déroulante des actions, sélectionnez **Execute Azure Function**

La liste des Azure Functions que vous avez inscrites est disponible dans la liste déroulante.

![Configurer une règle pour Azure Functions](https://mintcdn.com/microsoft-4404708b/dqv53299jA1M-fNi/images/playfab/live-service-management/service-gateway/automation/cloudscript-af/azure_function_rules.png?fit=max\&auto=format\&n=dqv53299jA1M-fNi\&q=85\&s=f48a4376587a492bd3dcbf1efa86c666)

## Débogage de votre Azure Function

Avec Azure Functions, vous avez désormais la possibilité de déboguer votre CloudScript localement ou dans le portail Azure. Pour en savoir plus sur le débogage dans le portail, consultez [Débogage de CloudScript avec Azure Functions dans le portail Azure](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/debugging-with-CloudScript-AF-Azure.md). Pour savoir comment configurer le débogage local, consultez [Débogage local de CloudScript avec Azure Functions](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/local-debugging-for-cloudscript-using-azure-functions.md).

## Limites d'exécution

Les appels CloudScript vers Azure Functions sont soumis à des délais d'expiration. Si l'exécution de votre webhook prend trop de temps, la requête expire dans PlayFab. Assurez-vous que votre code s'exécute suffisamment rapidement pour rester en deçà des délais d'expiration.

| Source | Type d'action | Limite (secondes) |
| - | - | -: |
| API PlayFab | Requête HTTP | 10 |
| PlayStream V2 | Requête HTTP | 10 |
| Tâche planifiée | Requête HTTP | 4.5 |
| PlayStream V1 | Requête HTTP | 1 |
| Fonction de file d'attente | Charge utile de file d'attente | 1 |


## Related topics

- [PlayFab CloudScript avec Azure Functions](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/index.md)
- [Débogage local de CloudScript avec Azure Functions](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/local-debugging-for-cloudscript-using-azure-functions.md)
- [Modèles de contexte de PlayFab CloudScript avec Azure Functions](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/CloudScript-af-context.md)
- [Déboguer CloudScript avec Azure Functions dans le portail Azure](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/debugging-with-CloudScript-AF-Azure.md)
- [Déboguer CloudScript avec Azure Functions dans Visual Studio Code](https://docs.xbox.com/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/debugging-with-CloudScript-AF-VSCode.md)
