You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Cosmos DB附件限制及外部存储附件的C#实现咨询

关于Cosmos DB关联外部存储Blob的解答

好问题!我来帮你理清Cosmos DB附件关联外部存储的相关细节:

1. Cosmos DB确实支持关联外部存储的Blob payload

你理解的没错,Cosmos DB的附件机制并不强制要求把二进制内容存在自身账户里。当你需要突破2GB的总附件存储上限时,完全可以将媒体/Blob内容存放在外部服务(比如CDN、Azure Blob Storage或者其他自定义存储系统),然后在Cosmos DB的附件文档中只存储指向外部资源的元数据(比如资源URL、内容类型、大小等),以此建立关联。

2. .NET NuGet包(v1.19.1)完全可以实现,无需仅依赖REST调用

你正在使用的Microsoft.Azure.DocumentDB v1.19.1包支持创建这种外部关联的附件,不需要单独写REST请求。核心区别在于:创建附件时,你不需要设置用于上传内部二进制流的MediaStream属性,而是设置MediaLink属性为外部存储资源的公开(或有权限的)URL,同时可按需补充ContentType、ContentLength等元数据。

给你一个简单的C#代码示例:

// 初始化DocumentClient(假设你已经完成了这一步)
var client = new DocumentClient(new Uri("your-cosmos-db-endpoint"), "your-access-key");

// 目标文档的SelfLink(可通过查询或创建文档时获取)
var targetDocumentLink = "dbs/your-database-id/colls/your-collection-id/docs/your-document-id";

// 创建指向外部Blob的附件
var externalAttachment = new Attachment
{
    Id = "user-profile-photo",
    MediaLink = "https://your-cdn-domain.com/assets/user-123-photo.jpg", // 外部存储的Blob URL
    ContentType = "image/jpeg",
    ContentLength = 45678 // 可选:外部Blob的字节大小
};

// 将附件关联到目标文档
var createdAttachment = await client.CreateAttachmentAsync(targetDocumentLink, externalAttachment);

// 后续读取附件时,直接通过MediaLink访问外部资源
var retrievedAttachment = await client.ReadAttachmentAsync(createdAttachment.SelfLink);
Console.WriteLine($"访问外部Blob的地址:{retrievedAttachment.MediaLink}");

3. 额外注意事项

  • 这种方式下,Cosmos DB仅负责维护附件的元数据和关联关系,实际的二进制内容存储、权限控制、生命周期管理都需要你自己在外部存储系统中处理。
  • Microsoft.Azure.DocumentDB v1.19.1是比较老旧的SDK版本了,如果项目允许,建议升级到最新的Microsoft.Azure.Cosmos SDK(针对SQL API的新一代SDK),它的API设计更直观,也支持更多现代功能,但旧版本的上述逻辑是完全兼容可用的。

内容的提问来源于stack exchange,提问作者Shaun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:10