[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-e3f76d4f-ab19-4441-b5e6-e7a088095c88":3,"$f9IaubB80BGkxa2gMGdW46FRNdtucPQuSu8XxKFbGpck":42},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":33},"e3f76d4f-ab19-4441-b5e6-e7a088095c88","azure-mgmt-apimanagement-dotnet",".NET中的Azure资源管理器SDK用于API管理。","cat_coding_backend","mod_coding","sickn33,coding","---\nname: azure-mgmt-apimanagement-dotnet\ndescription: Azure Resource Manager SDK for API Management in .NET.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\n---\n\n# Azure.ResourceManager.ApiManagement (.NET)\n\nManagement plane SDK for provisioning and managing Azure API Management resources via Azure Resource Manager.\n\n> **⚠️ Management vs Data Plane**\n> - **This SDK (Azure.ResourceManager.ApiManagement)**: Create services, APIs, products, subscriptions, policies, users, groups\n> - **Data Plane**: Direct API calls to your APIM gateway endpoints\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.ApiManagement\ndotnet add package Azure.Identity\n```\n\n**Current Version**: v1.3.0\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.ApiManagement;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    └── ResourceGroupResource\n        └── ApiManagementServiceResource\n            ├── ApiResource\n            │   ├── ApiOperationResource\n            │   │   └── ApiOperationPolicyResource\n            │   ├── ApiPolicyResource\n            │   ├── ApiSchemaResource\n            │   └── ApiDiagnosticResource\n            ├── ApiManagementProductResource\n            │   ├── ProductApiResource\n            │   ├── ProductGroupResource\n            │   └── ProductPolicyResource\n            ├── ApiManagementSubscriptionResource\n            ├── ApiManagementPolicyResource\n            ├── ApiManagementUserResource\n            ├── ApiManagementGroupResource\n            ├── ApiManagementBackendResource\n            ├── ApiManagementGatewayResource\n            ├── ApiManagementCertificateResource\n            ├── ApiManagementNamedValueResource\n            └── ApiManagementLoggerResource\n```\n\n## Core Workflow\n\n### 1. Create API Management Service\n\n```csharp\nusing Azure.ResourceManager.ApiManagement;\nusing Azure.ResourceManager.ApiManagement.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define service\nvar serviceData = new ApiManagementServiceData(\n    location: AzureLocation.EastUS,\n    sku: new ApiManagementServiceSkuProperties(\n        ApiManagementServiceSkuType.Developer, \n        capacity: 1),\n    publisherEmail: \"admin@contoso.com\",\n    publisherName: \"Contoso\");\n\n\u002F\u002F Create service (long-running operation - can take 30+ minutes)\nvar serviceCollection = resourceGroup.Value.GetApiManagementServices();\nvar operation = await serviceCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-apim-service\",\n    serviceData);\n\nApiManagementServiceResource service = operation.Value;\n```\n\n### 2. Create an API\n\n```csharp\nvar apiData = new ApiCreateOrUpdateContent\n{\n    DisplayName = \"My API\",\n    Path = \"myapi\",\n    Protocols = { ApiOperationInvokableProtocol.Https },\n    ServiceUri = new Uri(\"https:\u002F\u002Fbackend.contoso.com\u002Fapi\")\n};\n\nvar apiCollection = service.GetApis();\nvar apiOperation = await apiCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-api\",\n    apiData);\n\nApiResource api = apiOperation.Value;\n```\n\n### 3. Create a Product\n\n```csharp\nvar productData = new ApiManagementProductData\n{\n    DisplayName = \"Starter\",\n    Description = \"Starter tier with limited access\",\n    IsSubscriptionRequired = true,\n    IsApprovalRequired = false,\n    SubscriptionsLimit = 1,\n    State = ApiManagementProductState.Published\n};\n\nvar productCollection = service.GetApiManagementProducts();\nvar productOperation = await productCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"starter\",\n    productData);\n\nApiManagementProductResource product = productOperation.Value;\n\n\u002F\u002F Add API to product\nawait product.GetProductApis().CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-api\");\n```\n\n### 4. Create a Subscription\n\n```csharp\nvar subscriptionData = new ApiManagementSubscriptionCreateOrUpdateContent\n{\n    DisplayName = \"My Subscription\",\n    Scope = $\"\u002Fproducts\u002F{product.Data.Name}\",\n    State = ApiManagementSubscriptionState.Active\n};\n\nvar subscriptionCollection = service.GetApiManagementSubscriptions();\nvar subOperation = await subscriptionCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-subscription\",\n    subscriptionData);\n\nApiManagementSubscriptionResource subscription = subOperation.Value;\n\n\u002F\u002F Get subscription keys\nvar keys = await subscription.GetSecretsAsync();\nConsole.WriteLine($\"Primary Key: {keys.Value.PrimaryKey}\");\n```\n\n### 5. Set API Policy\n\n```csharp\nvar policyXml = @\"\n\u003Cpolicies>\n    \u003Cinbound>\n        \u003Crate-limit calls=\"\"100\"\" renewal-period=\"\"60\"\" \u002F>\n        \u003Cset-header name=\"\"X-Custom-Header\"\" exists-action=\"\"override\"\">\n            \u003Cvalue>CustomValue\u003C\u002Fvalue>\n        \u003C\u002Fset-header>\n        \u003Cbase \u002F>\n    \u003C\u002Finbound>\n    \u003Cbackend>\n        \u003Cbase \u002F>\n    \u003C\u002Fbackend>\n    \u003Coutbound>\n        \u003Cbase \u002F>\n    \u003C\u002Foutbound>\n    \u003Con-error>\n        \u003Cbase \u002F>\n    \u003C\u002Fon-error>\n\u003C\u002Fpolicies>\";\n\nvar policyData = new PolicyContractData\n{\n    Value = policyXml,\n    Format = PolicyContentFormat.Xml\n};\n\nawait api.GetApiPolicy().CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    policyData);\n```\n\n### 6. Backup and Restore\n\n```csharp\n\u002F\u002F Backup\nvar backupParams = new ApiManagementServiceBackupRestoreContent(\n    storageAccount: \"mystorageaccount\",\n    containerName: \"apim-backups\",\n    backupName: \"backup-2024-01-15\")\n{\n    AccessType = StorageAccountAccessType.SystemAssignedManagedIdentity\n};\n\nawait service.BackupAsync(WaitUntil.Completed, backupParams);\n\n\u002F\u002F Restore\nawait service.RestoreAsync(WaitUntil.Completed, backupParams);\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `ApiManagementServiceResource` | Represents an APIM service instance |\n| `ApiManagementServiceCollection` | Collection for service CRUD |\n| `ApiResource` | Represents an API |\n| `ApiManagementProductResource` | Represents a product |\n| `ApiManagementSubscriptionResource` | Represents a subscription |\n| `ApiManagementPolicyResource` | Service-level policy |\n| `ApiPolicyResource` | API-level policy |\n| `ApiManagementUserResource` | Represents a user |\n| `ApiManagementGroupResource` | Represents a group |\n| `ApiManagementBackendResource` | Represents a backend service |\n| `ApiManagementGatewayResource` | Represents a self-hosted gateway |\n\n## SKU Types\n\n| SKU | Purpose | Capacity |\n|-----|---------|----------|\n| `Developer` | Development\u002Ftesting (no SLA) | 1 |\n| `Basic` | Entry-level production | 1-2 |\n| `Standard` | Medium workloads | 1-4 |\n| `Premium` | High availability, multi-region | 1-12 per region |\n| `Consumption` | Serverless, pay-per-call | N\u002FA |\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** for long operations like service creation (30+ min)\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Navigate hierarchy** via `Get*` methods (e.g., `service.GetApis()`)\n7. **Policy format** — Use XML format for policies; JSON is also supported\n8. **Service creation** — Developer SKU is fastest for testing (~15-30 min)\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await serviceCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, serviceName, serviceData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Service already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Bad request: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Reference Files\n\n| File | When to Read |\n|------|--------------|\n| references\u002Fservice-management.md | Service CRUD, SKUs, networking, backup\u002Frestore |\n| references\u002Fapis-operations.md | APIs, operations, schemas, versioning |\n| references\u002Fproducts-subscriptions.md | Products, subscriptions, access control |\n| references\u002Fpolicies.md | Policy XML patterns, scopes, common policies |\n\n## Related Resources\n\n| Resource | Purpose |\n|----------|---------|\n| [API Management Documentation](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fapi-management\u002F) | Official Azure docs |\n| [Policy Reference](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fapi-management\u002Fapi-management-policies) | Complete policy reference |\n| [SDK Reference](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fapi\u002Fazure.resourcemanager.apimanagement) | .NET API reference |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,68,742,"2026-05-16 13:06:52",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":25,"skillCount":32,"createdAt":26},"后端开发","backend","mdi-server","API、数据库、服务端架构",296,[34],{"id":35,"skillId":4,"version":36,"fileName":37,"fileSize":38,"filePath":39,"fileHash":40,"manifest":41,"createdAt":19},"1a6bff84-40a2-4098-acdb-0ca2c3ff397b","1.0.0","azure-mgmt-apimanagement-dotnet.zip",3354,"uploads\u002Fskills\u002Fe3f76d4f-ab19-4441-b5e6-e7a088095c88\u002Fazure-mgmt-apimanagement-dotnet.zip","d061a261d0ea09bd8f45572ce291272df84fd034691e0f5e0aeb8431fe32d27f","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":9751}]",{"code":43,"message":44,"data":45},200,"success",{"items":46,"stats":47,"page":50},[],{"averageRating":48,"totalRatings":48,"ratingCounts":49},0,[48,48,48,48,48],{"limit":51,"offset":48,"hasMore":52,"nextOffset":51,"ratedOnly":16},15,false]