【问题标题】:Azure Generate Resource Group C#Azure 生成资源组 C#
【发布时间】:2015-12-16 17:26:24
【问题描述】:

我希望你能在代码中帮助我,我在生成创建资源组的代码时遇到了麻烦,但由于某种原因我无法理解错误是什么……我使用了 github 的代码:https://github.com/Microsoft/azure-content/blob/master/articles/virtual-machines/arm-template-deployment.md我需要为工作中的项目工作这个例子......如果能帮助我找到这段代码的解决方案,我将非常感激......

这里是代码:

程序.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Azure.Management.Resources;
using Microsoft.Azure.Management.Resources.Models;
using Microsoft.WindowsAzure;

namespace pruebaazure
{
    class Program
    {
        static void Main(string[] args)
        {
            var token = GetAuthorizationHeader();
            var credential = new Microsoft.WindowsAzure.TokenCloudCredentials("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxef", token);


            CreateResourceGroup(credential);
            Console.ReadLine();

            CreateTemplateDeployment(credential);
            Console.ReadLine();

            DeleteResourceGroup(credential);
            Console.ReadLine();


        }
        private static string GetAuthorizationHeader()
        {
            ClientCredential cc = new ClientCredential("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx8", "xxxxxxxK2");
            var context = new AuthenticationContext("https://login.windows.net/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx4");
            var result = context.AcquireToken("https://management.azure.com/", cc);
            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            string token = result.AccessToken;

            return token;
        }

        public async static void CreateResourceGroup(TokenCloudCredentials credential)
        {
            Console.WriteLine("Creating the resource group...");
            var resourceGroup = new ResourceGroup { Location = "West US" };
            using (var resourceManagementClient = new ResourceManagementClient(credential))
            {
                var rgResult = await resourceManagementClient.ResourceGroups.CreateOrUpdateAsync("mytestrg1", resourceGroup);
                Console.WriteLine(rgResult.StatusCode);
            }
        }

        public async static void CreateTemplateDeployment(TokenCloudCredentials credential)
        {
            Console.WriteLine("Creating the template deployment...");
            var deployment = new Deployment();
            deployment.Properties = new DeploymentProperties
            {
                Mode = DeploymentMode.Incremental,
                TemplateLink = new TemplateLink
                {
                    Uri = new Uri("https://xxxxxxxxxxxxya.blob.core.windows.net/templates/VirtualMachineTemplate.json").ToString()
                },
                ParametersLink = new ParametersLink
                {
                    Uri = new Uri("https://xxxxxxxxxxxxxya.blob.core.windows.net/templates/Parameters.json").ToString()
                }
            };
            using (var templateDeploymentClient = new ResourceManagementClient(credential))
                {
                var dpResult = await templateDeploymentClient.Deployments.CreateOrUpdateAsync("mytestrg1", "mytestdp1", deployment);
                Console.WriteLine(dpResult.StatusCode);
            }
        }

        public async static void DeleteResourceGroup(TokenCloudCredentials credential)
        {
            using (var resourceGroupClient = new ResourceManagementClient(credential))
            {
                var rgResult = await resourceGroupClient.ResourceGroups.DeleteAsync("mytestrg1");
                Console.WriteLine(rgResult.StatusCode);
            }
        }
    }
}

Parameters.json

{
  "contentVersion": "1.0.0.0",
  "parameters": { 
    "vmName": { "value": "mytestvm1" },
    "newStorageAccountName": { "value": "mytestsa1" },
    "storageAccountType": { "value": "Standard_LRS" },
    "publicIPaddressName": { "value": "mytestip1" },
    "location": { "value": "West US" },
    "vmStorageAccountContainerName": { "value": "vhds" },
    "vmSize": { "value": "Standard_A1" },
    "subscriptionId": { "value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxef" },
    "vmSourceImageName": { "value": "sourceimgtest1" },
    "adminUserName": { "value": "mytestacct1" },
    "adminPassword": { "value": "mytestpass1" },
    "virtualNetworkName": { "value": "mytestvn1" },
    "dnsName": { "value": "mytestdns1" }, 
    "nicName": { "value": "mytestnic1" } 
  }
}

VirtualMachineTemplate.json

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/VM.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "String",
      "defaultValue": "West US",
      "allowedValues": [ "West US", "East US" ]
    },
    "newStorageAccountName": { "type": "string" },
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [ "Standard_LRS", "Standard_GRS" ]
    },
    "publicIPAddressName": { "type": "string" },
    "publicIPAddressType": {
      "type": "string",
      "defaultValue": "Dynamic",
      "allowedValues": [ "Dynamic" ]
    },
    "vmStorageAccountContainerName": {
      "type": "string",
      "defaultValue": "vhds"
    },
    "vmName": { "type": "string" },
    "vmSize": {
      "type": "string",
      "defaultValue": "Standard_A0",
      "allowedValues": [ "Standard_A0", "Standard_A1" ]
    },
    "vmSourceImageName": { "type": "string" },
    "adminUserName": { "type": "string" },
    "adminPassword": { "type": "securestring" },
    "virtualNetworkName": { "type": "string" },
    "addressPrefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/16"
        },
        "subnet1Name": {
          "type": "string",
          "defaultValue": "Subnet-1"
        },
        "subnet2Name": {
          "type": "string",
          "defaultValue": "Subnet-2"
        },
        "subnet1Prefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/24"
    },
    "subnet2Prefix": {
      "type": "string",
      "defaultValue": "10.0.1.0/24"
    },
    "dnsName": { "type": "string" },
    "subscriptionId": { "type": "string" },
    "nicName": { "type": "string" }
  },
  "resources": [
    {
      "apiVersion": "2014-12-01-preview",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[parameters('newStorageAccountName')]",
      "location": "[parameters('location')]",
      "properties": { "accountType": "[parameters('storageAccountType')]" }
    },
    {
      "apiVersion": "2014-12-01-preview",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[parameters('publicIPAddressName')]",
      "location": "[parameters('location')]",
      "properties": {
        "publicIPAllocationMethod": "[parameters('publicIPAddressType')]",
        "dnsSettings": { "domainNameLabel": "[parameters('dnsName')]" }
      }
    },
    {
      "apiVersion": "2014-12-01-preview",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[parameters('virtualNetworkName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": { "addressPrefixes": [ "[parameters('addressPrefix')]" ] },
        "subnets": [
          {
            "name": "[parameters('subnet1Name')]",
            "properties": { "addressPrefix": "[parameters('subnet1Prefix')]"     }
          },
          {
            "name": "[parameters('subnet2Name')]",
            "properties": { "addressPrefix": "[parameters('subnet2Prefix')]"     }
          }
        ]
      }
    },
    {
      "apiVersion": "2014-12-01-preview",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[parameters('nicName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPAddressName'))]",
        "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddressName'))]"
              },
              "subnet": { "id": "[variables('subnet1Ref')]" }
            }
          }
        ]
      }
    },
    {
      "apiVersion": "2014-12-01-preview",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', parameters('newStorageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', parameters('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": { "vmSize": "[parameters('vmSize')]" },
        "osProfile": {
          "computername": "[parameters('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]",
          "windowsProfile": { "provisionVMAgent": "true" }
        },
        "storageProfile": {
          "sourceImage": { "id": "[variables('sourceImageName')]" },
          "destinationVhdsContainer": "[concat('http://',parameters('newStorageAccountName'),'.blob.core.windows.net/',    parameters('vmStorageAccountContainerName'),'/')]"
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',parameters('nicName'))]"
            }
          ]
        }
      }
    }
  ],
  "variables": {
    "sourceImageName": "[concat('/',parameters('subscriptionId'),'/services/images/',parameters('vmSourceImageName'))]",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]",
    "subnet1Ref": [concat(variables('vnetID'),'/subnets/',parameters('subnet1Name'))]"
      }
   }
}

问题出在program.cs哪里

    public async static void CreateResourceGroup(TokenCloudCredentials credential)
    {
        Console.WriteLine("Creating the resource group...");
        var resourceGroup = new ResourceGroup { Location = "West US" };
        using (var resourceManagementClient = new ResourceManagementClient(credential))
        {
            var rgResult = await resourceManagementClient.ResourceGroups.CreateOrUpdateAsync("mytestrg1", resourceGroup);
            Console.WriteLine(rgResult.StatusCode);
        }
    }

在:

 (var resourceManagementClient = new ResourceManagementClient(credential)) 

错误是:

cannot convert from Microsoft.WindowsAzure.TokenCloudCredentials credentials to Microsoft.Rest.CerviceClientCredentials 

Console.WriteLine(rgResult.StatusCode); 

错误是:

ResourcesGroup does not contain the definition for "StatusCode" and no extension method "StatusCode" accepting a first argument of type 'ResourceGroup' Could be found 

public async static void CreateTemplateDeployment(TokenCloudCredentials credential) 

错误是相同的,无法在此处将 Microsoft.WindowsAzure.TokenCloudCredentials 凭据转换为 Microsoft.Rest.CerviceClientCredentials

using (var templateDeploymentClient = new ResourceManagementClient(credential))
            {
                var dpResult = await templateDeploymentClient.Deployments.CreateOrUpdateAsync("mytestrg1", "mytestdp1", deployment);
                Console.WriteLine(dpResult.StatusCode);
            } 

为此:

    public async static void DeleteResourceGroup(TokenCloudCredentials credential)
    {
        using (var resourceGroupClient = new ResourceManagementClient(credential))
        {
            var rgResult = await resourceGroupClient.ResourceGroups.DeleteAsync("mytestrg1");
            Console.WriteLine(rgResult.StatusCode);
        }
    }

【问题讨论】:

标签: c# json azure azure-sdk-.net azure-resource-manager


【解决方案1】:

我假设您使用的是 "Microsoft.Azure.Management.Resources" nuget 包的最新预览版,即 version="3.3.0-preview"

从您的代码和显示的错误来看,问题的根本原因在于这行代码:

var credential = new Microsoft.WindowsAzure.TokenCloudCredentials("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxef", token);

更清楚一点,Microsoft.WindowsAzure 命名空间下的 TokenCloudCredentials 类不是 ResourceManagementClient 中 ServiceClientCredentials 抽象类的子类。

您应该使用 Microsoft.Rest 命名空间下的 TokenCloudCredentials

因此您可以按如下方式修复它:

var credential = new Microsoft.Rest.TokenCloudCredentials(token);

您还可以参考下面 GitHub 存储库中的一些示例代码: AzureResourceManagementSDKSample 了解如何使用最新的 "Microsoft.Azure.Management.Resources" nuget 包来创建/读取/更新/删除资源组以及创建资源组模板部署。

希望这会有所帮助!

【讨论】:

  • 我使用最新版本的 Microsoft.Azure.Management.Resources... 我已经下载了最后一个 Azure SDK 2.8.14 并且我处于同样的情况,我无法执行使用的程序原因 (var resourceManagementClient = new ResourceManagementClient(credential)) 错误是这样的:无法从 Microsoft.WindowsAzure.TokenCloudCredentials 凭据转换为 Microsoft.Rest.CerviceClientCredentials
  • 我已经编辑了我的答案,希望它更清晰易懂。如果您需要任何进一步的说明以及它是否能解决您的问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多