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

# 使用 Azure Functions 的排行榜

> 使用 Azure Functions CloudScript 构建 PlayFab 排行榜的教程，展示如何从服务器端代码提交分数和查询排名。

在本教程中，您将学习如何使用 Cloudscript（特别是通过 [Azure Functions](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af)）实现排行榜。此方法很强大，因为它使您能够创建自定义服务器端逻辑，而无需更新客户端。

通过在 Azure Function 中定义与排行榜相关的逻辑，您的客户端可以调用该函数来执行代码。如果以后需要更改，您可以独立更新 Azure Function — 通常无需修改客户端，具体取决于更新的复杂性。

## 先决条件

若要按照本教程操作，您需要：

* PlayFab 账户。如果您没有账户，可以在[此处](https://developer.playfab.com/)创建。
* Azure 订阅。如果您没有订阅，可以在[此处](https://azure.microsoft.com/free/)创建。

有关如何创建 Azure Function 的更多详细信息，请参阅此指南。[使用 Visual Studio 在 Azure 中创建你的第一个函数](https://learn.microsoft.com/azure/azure-functions/functions-create-your-first-function-visual-studio)

## 使用 Azure Functions 创建排行榜

在本节中，我们将创建一个允许您提交分数并检索最高分数的排行榜。

```C# theme={null}
[Function("LeaderboardExample")]
public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    PlayFabSettings.staticSettings.TitleId = "78C3E"; // Change this value to your own titleId from PlayFab Game Manager
    PlayFabSettings.staticSettings.DeveloperSecretKey = "WJT5SBP7PUFH61JHE39QQ4F1SJKGBWBJR647CH1WYB9CS3MZDD"; // Change this to your title's secret key from Game Manager
                                                                                                              // Check if parameter exists
    if (string.IsNullOrEmpty(req.Query["leaderboardName"]))
    {
        var badResponse = req.CreateResponse(HttpStatusCode.BadRequest);
        badResponse.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        badResponse.WriteString("Please pass a leaderboardName on the query string");
        return badResponse;
    }

    PlayFabAuthenticationContext authContext = await LoginAsTitleEntity();
    var result = await CreateLeaderboardDefinitionAsync(authContext, req.Query["leaderboardName"]);
    if (result != null)
    {
        if (result.Error != null) {
            PlayFabError apiError = result.Error;
            var response = req.CreateResponse(HttpStatusCode.BadRequest);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            if (apiError != null)
            {
                response.WriteString("Something went wrong with your API call.  :");
                response.WriteString("Here's some debug information:");
                response.WriteString(PlayFabUtil.GenerateErrorReport(apiError));
                return response;
            }
            response.WriteString("Something went wrong with your API call but it wasn't possible to get a PlayFab error description.");
            return response;
        }
        else
        {
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            response.WriteString("Leaderboard created successfully!");
            return response;
        }
    }
    else 
    {
        var response = req.CreateResponse(HttpStatusCode.BadRequest);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        response.WriteString("Something went wrong with your API call.  :");
        return response;
    }    
    
}

```

* 此函数特性 `[Function("LeaderboardExample")]` 定义了函数的名称，在此情况下为 `LeaderboardExample`。
* 该函数由 HTTP 请求触发，如 `[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]` 特性所示。这意味着可以通过 HTTP GET 和 POST 方法访问该函数，无需任何身份验证。
* 在该函数内，我们设置 PlayFab Title ID 和 Developer Secret Key，以对我们向 PlayFab 服务发出的请求进行身份验证。您可以根据特定情况和安全要求最合适的方式更改访问这些值的方式。
* 该函数检查请求中是否提供了查询参数“leaderboardName”。
* 然后，我们调用 `LoginAsTitleEntity` 方法以作为游戏实体进行身份验证，这是创建排行榜定义所必需的。
* 最后，我们调用 `CreateLeaderboardDefinitionAsync` 方法，使用所提供的名称创建排行榜定义。若要详细了解排行榜的创建，请参阅 [创建基础排行榜](/services/playfab/community/leaderboards/create-basic-leaderboard) 和 [排行榜的更多用法](/services/playfab/community/leaderboards/doing-more-with-leaderboards)。

RunAsync 方法作为 Azure Function 的入口点。从那里，您可以定义并调用其他方法以构建自定义游戏逻辑。如何处理错误或与多个 PlayFab 服务交互完全取决于您，从而使您在实现中具有完全的灵活性。

此外，您可以配置自动化规则以基于特定事件触发此 Azure Function。有关更多详细信息，请参阅[此处](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart)。

## 另请参阅

* [排行榜的更多用法](/services/playfab/community/leaderboards/doing-more-with-leaderboards)。
* [创建基础排行榜](/services/playfab/community/leaderboards/create-basic-leaderboard)。
* [手动等级](/services/playfab/community/leaderboards/manual-tiers)。
* [限制](/services/playfab/community/leaderboards/limits-leaderboards)。
* [配额](/services/playfab/community/leaderboards/quota-leaderboards)。
* [赛季排行榜](/services/playfab/community/leaderboards/seasonal-leaderboards)。
* [根据统计信息为玩家排名](/services/playfab/community/leaderboards/leaderboards-linked-to-stats)。
* [向排行榜添加上下文数据](/services/playfab/community/leaderboards/metadata-leaderboards)。
* [使用 Playstream 的排行榜](/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry)。
* [API 参考](/services/playfab/community/leaderboards/api-reference)。


## Related topics

- [排行榜](/zh-CN/build/steam-porting-guide/features/steam-leaderboards.md)
- [组排行榜](/zh-CN/services/playfab/community/leaderboards/group-leaderboards.md)
- [基于事件的排行榜概述](/zh-CN/services/xbox-services/player-data/stats-leaderboards/event-based/live-leaderboards-eb-overview.md)
- [获取标题管理的排行榜](/zh-CN/services/xbox-services/player-data/stats-leaderboards/title-managed/how-to/live-getting-tm-leaderboard.md)
- [基于事件的排行榜的门户配置](/zh-CN/services/xbox-services/player-data/stats-leaderboards/event-based/config/live-eb-leaderboards-portal.md)
