> ## 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.

# 内容分发网络快速入门

> 从旧版 PlayFab CDN 按键存储和提供游戏资源，包括文件夹路径、边缘缓存行为，以及上传、覆盖和删除的延迟。

<Info>
  PlayFab CDN 是一项旧功能，仅对至少有一个先前已配置 CDN 的标题的账户提供支持。对于希望获得内容管理解决方案的新 PlayFab 开发者，我们建议使用 Azure CDN。若要开始使用，请参阅 [Azure CDN 文档](https://learn.microsoft.com/en-us/azure/cdn/)。
</Info>

PlayFab 内容分发网络 (CDN) 将单个资产存储为由文件名（也称为*键*）唯一标识的文件。这意味着你可以按键添加、更新、移除和检索资产。

PlayFab CDN 允许按文件夹分隔资产。指向资产的文件夹路径成为*资产键*的一部分。

以下示例是一个存储在名为 `Android` 的文件夹内的有效资产键。

`Android/Image.png`。

当用户获取资产时，其请求会被自动路由到最近的边缘位置，因此以尽可能好的性能交付内容。

然而，这可能会给文件管理操作引入延迟，例如以下示例所示：

* **文件上传**：你的文件立即可用。

* **文件覆盖**：旧文件对用户可见时间最长可达 24 小时，直到被新文件覆盖。

* **文件删除**：文件继续存在最长 24 小时，同时删除命令将其从所有边缘位置移除。

## 上传资产

在用户能够获取资产之前，必须将其上传到 CDN。这可以在 **Game Manager** 中完成：

* 从左侧菜单选择 **Content**。
* 选择 **File Management** 选项卡。
* 然后选择 **Upload Files**。

<img src="https://mintcdn.com/microsoft-4404708b/MjJ0-cTsb1bpaMcX/images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-content-file-management-upload-files.png?fit=max&auto=format&n=MjJ0-cTsb1bpaMcX&q=85&s=8434341dcd92836b082c55dbaa661e4b" alt="Game Manager - Content - File Management - 上传文件" width="2560" height="1184" data-path="images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-content-file-management-upload-files.png" />

你可以：

* 选择多个**文件 (1)**。
* 所选的每个文件都会出现在列表 **(2)** 中。
* 通过选择 **Upload Files** 按钮 **(3)** 提交你的文件。

<img src="https://mintcdn.com/microsoft-4404708b/MjJ0-cTsb1bpaMcX/images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-choose-and-upload-files.png?fit=max&auto=format&n=MjJ0-cTsb1bpaMcX&q=85&s=7c6bbd20066b2a6c40bdc062c8ec9603" alt="Game Manager - 选择并上传文件" width="924" height="580" data-path="images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-choose-and-upload-files.png" />

* 已上传的文件出现在列表 **(1)** 中。

* 请记住，你也可以管理*文件夹*。
  * 要创建文件夹，请选择 **New Folder** 按钮 **(2)**。

* 填写**文件夹名称 (1)**。

* 选择 **Create Folder** 按钮 **(2)**。

<img src="https://mintcdn.com/microsoft-4404708b/MjJ0-cTsb1bpaMcX/images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-create-new-folder.png?fit=max&auto=format&n=MjJ0-cTsb1bpaMcX&q=85&s=b25109c958f0156cb00fd5a84d75ddbd" alt="Game Manager - 创建新文件夹" width="913" height="240" data-path="images/playfab/data-analytics/legacy/content-delivery-network/tutorials/game-manager-create-new-folder.png" />

这将在树中创建一个新文件夹。然后你可以选择此文件夹，并像往常一样上传文件。

或者，你可以使用管理 SDK 通过代码上传资产。这是一个两步过程：

1. 首先，调用 [GetContentUploadUrl](xref:titleid.playfabapi.com.admin.content.getcontentuploadurl) 并获取授权你上传的预签名 URL。
2. 然后，使用该 URL 发起 `HTTP PUT` 请求，提供你的数据以及（可选）内容类型。

考虑使用下面提供的展示如何获取预签名 URL 的代码片段。

```csharp theme={null}
public void UploadFileToCDN(string key, byte[] content, string contentType = "binary/octet-stream") {
    GetUploadUrl(key, contentType, presignedUrl => {
        PutFile(presignedUrl, content, contentType);
    });
}

void GetUploadUrl(string key, string contentType, Action<string> onComplete) {
    PlayFabAdminAPI.GetContentUploadUrl(new GetContentUploadUrlRequest() {
        ContentType = contentType,
        Key = key
    }, result => onComplete(result.URL),
    error => Debug.LogError(error.GenerateErrorReport()));
}

void PutFile(string presignedUrl, byte[] content, string contentType = "binary/octet-stream") {
    // Implement your own PUT HTTP request here.
    // - Must use PUT method
    // - Must set content type Header
}
```

然后，你可以通过 PlayFab Game Manager 检查结果。确保文件在列表中。

## 获取资产

通过代码下载资产与上传资产完全相同。如前所述，这是一个两步过程。

1. 首先，调用 [GetContentDownloadUrl](xref:titleid.playfabapi.com.client.content.getcontentdownloadurl) 并获取授权你下载的预签名 URL。
2. 然后你使用该预签名 URL 发起 `HTTP GET` 请求并获取数据。

考虑使用下面提供的展示流程基本框架的代码片段。

```csharp theme={null}
public void DownloadFileFromCDN(string key) {
    GetDownloadUrl(key, presignedUrl =>
    {
        GetFile(presignedUrl);
    });
}

void GetDownloadUrl(string key, Action<string> onComplete) {
    PlayFabClientAPI.GetContentDownloadUrl(new GetContentDownloadUrlRequest() {
        Key = key,
        ThruCDN = true
    }, result => onComplete(result.URL),
    error => Debug.LogError(error.GenerateErrorReport()));
}

void GetFile(string preauthorizedUrl) {
    // Implement your own GET HTTP request here.
}
```

如前所述，CDN 在文件更新方面可能存在延迟。在开发期间，有时强制获取最新的、最新鲜的文件很有用。

[GetContentDownloadUrl](xref:titleid.playfabapi.com.client.content.getcontentdownloadurl) 调用允许你将 `ThruCDN` 参数设置为 `False`。返回的 URL 指向未缓存的最新文件。

<Note>
  你已发布的游戏客户端*绝不应*使用此选项！
</Note>


## Related topics

- [内容分发网络](/zh-CN/services/playfab/data-analytics/legacy/content-delivery-network/index.md)
- [报告快速入门](/zh-CN/services/playfab/data-analytics/learn-data/reports/quickstart.md)
- [PlayFab 数据与分析文档](/zh-CN/services/playfab/data-analytics/index.md)
- [快速入门 (Windows) - Party 和 Multiplayer](/zh-CN/services/playfab/sdks/unified-sdk/quickstart-windows-party.md)
- [快速入门](/zh-CN/services/playfab/economy-monetization/economy-v2/quickstart.md)
