Azure API 管理 .NET 管理 SDK
Azure.ResourceManager.ApiManagement (.NET)
用于通过 Azure Resource Manager 部署和管理 Azure API Management 资源的管理平面 SDK。
> ⚠️ 管理平面 vs 数据平面
> - 本 SDK (Azure.ResourceManager.ApiManagement):创建服务、API、产品、订阅、策略、用户、组
> - 数据平面:直接调用 APIM 网关端点的 API 请求
安装
dotnet add package Azure.ResourceManager.ApiManagement
dotnet add package Azure.Identity当前版本:v1.3.0
环境变量
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
用于服务主体身份验证(可选)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>身份验证
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.ApiManagement;
// 始终使用 DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// 获取订阅
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
资源层级
ArmClient
└── SubscriptionResource
└── ResourceGroupResource
└── ApiManagementServiceResource
├── ApiResource
│ ├── ApiOperationResource
│ │ └── ApiOperationPolicyResource
│ ├── ApiPolicyResource
│ ├── ApiSchemaResource
│ └── ApiDiagnosticResource
├── ApiManagementProductResource
│ ├── ProductApiResource
│ ├── ProductGroupResource
│ └── ProductPolicyResource
├── ApiManagementSubscriptionResource
├── ApiManagementPolicyResource
├── ApiManagementUserResource
├── ApiManagementGroupResource
├── ApiManagementBackendResource
├── ApiManagementGatewayResource
├── ApiManagementCertificateResource
├── ApiManagementNamedValueResource
└── ApiManagementLoggerResource核心工作流
1. 创建 API Management 服务
using Azure.ResourceManager.ApiManagement;
using Azure.ResourceManager.ApiManagement.Models;
// 获取资源组
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");
// 定义服务
var serviceData = new ApiManagementServiceData(
location: AzureLocation.EastUS,
sku: new ApiManagementServiceSkuProperties(
ApiManagementServiceSkuType.Developer,
capacity: 1),
publisherEmail: "[email protected]",
publisherName: "Contoso");
// 创建服务(长时间运行的操作 - 可能需要 30 分钟以上)
var serviceCollection = resourceGroup.Value.GetApiManagementServices();
var operation = await serviceCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-apim-service",
serviceData);
ApiManagementServiceResource service = operation.Value;
2. 创建 API
var apiData = new ApiCreateOrUpdateContent
{
DisplayName = "My API",
Path = "myapi",
Protocols = { ApiOperationInvokableProtocol.Https },
ServiceUri = new Uri("https://backend.contoso.com/api")
};
var api
Collection = service.GetApis();
var apiOperation = await apiCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-api",
apiData);
ApiResource api = apiOperation.Value;
### 3. 创建产品var productData = new ApiManagementProductData
{
DisplayName = "Starter",
Description = "Starter tier with limited access",
IsSubscriptionRequired = true,
IsApprovalRequired = false,
SubscriptionsLimit = 1,
State = ApiManagementProductState.Published
};
var productCollection = service.GetApiManagementProducts();
var productOperation = await productCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"starter",
productData);
ApiManagementProductResource product = productOperation.Value;
// 将 API 添加到产品中
await product.GetProductApis().CreateOrUpdateAsync(
WaitUntil.Completed,
"my-api");
### 4. 创建订阅var subscriptionData = new ApiManagementSubscriptionCreateOrUpdateContent
{
DisplayName = "My Subscription",
Scope = $"/products/{product.Data.Name}",
State = ApiManagementSubscriptionState.Active
};
var subscriptionCollection = service.GetApiManagementSubscriptions();
var subOperation = await subscriptionCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-subscription",
subscriptionData);
ApiManagementSubscriptionResource subscription = subOperation.Value;
// 获取订阅密钥
var keys = await subscription.GetSecretsAsync();
Console.WriteLine($"Primary Key: {keys.Value.PrimaryKey}");
### 5. 设置 API 策略var policyXml = @"
<policies>
<inbound>
<rate-limit calls=""100"" renewal-period=""60"" />
<set-header name=""X-Custom-Header"" exists-action=""override"">
<value>CustomValue</value>
</set-header>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>";
var policyData = new PolicyContractData
{
Value = policyXml,
Format = PolicyContentFormat.Xml
};
await api.GetApiPolicy().CreateOrUpdateAsync(
WaitUntil.Completed,
policyData);
### 6. 备份与还原// 备份
var backupParams = new ApiManagementServiceBackupRestoreContent(
storageAccount: "mystorageaccount",
containerName: "apim-backups",
backupName: "backup-2024-01-15")
{
AccessType = StorageAccountAccessType.SystemAssignedManagedIdentity
};
await service.BackupAsync(WaitUntil.Completed, backupParams);
// 还原
await service.RestoreAsync(WaitUntil.Completed, backupParams);
## 关键类型参考
| 类型 | 用途 |
|------|---------|
| ArmClient | 所有 ARM 操作的入口点 |
| ApiManagementServiceResource | 表示一个 APIM 服务实例 |
| ApiManagementServiceCollection | 用于服务 CRUD 的集合 |
| ApiResource | 表示一个 API |
| ApiManagementProductResource | 表示一个产品 |
| ApiManagementSubscriptionResource | 表示一个订阅 |
| ApiManagementPolicyResource | 服务级策略 |
| ApiPolicyResource | API 级策略 |
| ApiManagementUserResource | 表示一个用户 |
| ApiManagementGroupResource | 表示一个组 |
| ApiManagementBackendResource | 表示一个后端服务 |
| ApiManagementGatewayResource | 表示一个自托管网关 |
SKU 类型
| SKU | 用途 | 容量 |
|-----|---------|----------|
| Developer | 开发 |
| 开发/测试(无 SLA) | 1 |
| Basic | 入门级生产环境 | 1-2 |
| Standard | 中型工作负载 | 1-4 |
| Premium | 高可用性,多区域 | 每个区域 1-12 |
| Consumption | Serverless,按调用付费 | N/A |
最佳实践
1. 对于必须在继续之前完成的操作,请使用 WaitUntil.Completed
2. 对于耗时较长的操作(如服务创建,需 30 分钟以上),请使用 WaitUntil.Started
3. 始终使用 DefaultAzureCredential —— 切勿硬编码密钥
4. 使用 RequestFailedException 处理 ARM API 错误
5. 对于幂等操作,请使用 CreateOrUpdateAsync
6. 通过 Get* 方法导航层级结构(例如 service.GetApis())
7. 策略格式 —— 策略请使用 XML 格式;同时也支持 JSON
8. 服务创建 —— 测试时使用 Developer SKU 速度最快(约 15-30 分钟)
错误处理
try
{
var operation = await serviceCollection.CreateOrUpdateAsync(
WaitUntil.Completed, serviceName, serviceData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("Service already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
Console.WriteLine($"Bad request: {ex.Message}");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}
```
参考文件
| 文件 | 阅读时机 |
|------|--------------|
| references/service-management.md | 服务 CRUD、SKU、网络、备份/还原 |
| references/apis-operations.md | API、操作、架构、版本控制 |
| references/products-subscriptions.md | 产品、订阅、访问控制 |
| references/policies.md | 策略 XML 模式、范围、常用策略 |
相关资源
| 资源 | 用途 |
|----------|---------|
| API Management Documentation | Azure 官方文档 |
| Policy Reference | 完整策略参考 |
| SDK Reference | .NET API 参考 |
使用场景
本技能适用于执行概览中描述的工作流或操作。局限性
- 仅在任务明确符合上述范围时使用此技能。
- 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
- 如果缺少必要的输入、权限、安全边界或成功标准,请停止并请求澄清。