Azure ARM uniqueString函数模仿

时间:2017-04-08 15:08:27

标签: arm-template azure-resource-manager

我需要使用以下方式将Sql数据库部署到Azure Sql Server:ARM模板方式,以及使用C#代码的更自定义方式。有一个名为uniqueString(string)的ARM模板函数,它生成给定字符串的伪随机散列。这是一个确定性的纯函数。

我需要找到一种方法来完全模仿我的C#代码中此函数的行为。即我需要将此功能复制到我的C#代码中。

我在哪里可以找到ARM Api使用的算法?

MSDN reference for uniqueString()

3 个答案:

答案 0 :(得分:2)

我在这里找到了一些PowerShell代码:https://blogs.technet.microsoft.com/389thoughts/2017/12/23/get-uniquestring-generate-unique-id-for-azure-deployments/

我将此代码转换为C#:

public string GetUniqueString(string id, int length = 13)
{
    string result = "";
    var buffer = System.Text.Encoding.UTF8.GetBytes(id);
    var hashArray = new System.Security.Cryptography.SHA512Managed().ComputeHash(buffer);
    for(int i = 1; i <= length; i++)
    {
        var b = hashArray[i];
        var c = Convert.ToChar((b % 26) + (byte)'a');
        result = result + c;
    }

    return result;
}

答案 1 :(得分:0)

我终于找到了解决方法。我使用了一个非常简单的ARM模板,其目标是仅输出uniqueString命令的结果。然后我在我的C#代码中获取此输出。这个解决方案实际上并不是最快的;-),但它可以按预期工作。

答案 2 :(得分:0)

我自己已经断断续续地研究这个几年,我终于遇到了麻烦...

// "zcztcwvu6iyg6"
var unique = ArmUniqueString("tyeth");

我的 ArmUniqueString 函数是一些 dll 的包装器,这些 dll 随 Azure Stack Hub Development Kit 一起分发,Azure Stack Hub Development Kit 基本上是一个包含可以在本地运行的 Azure 服务器端平台的虚拟机映像...< /p>

private static string ArmUniqueString(string originalString)
{

    var assembly = Assembly.GetAssembly(
        typeof(Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Engines.TemplateEngine)
    );

    var functions = assembly.GetType(
        "Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Expressions.TemplateExpressionBuiltInFunctions"
    );

    var uniqueString = functions.GetMethod(
        "UniqueString",
        BindingFlags.Static | BindingFlags.NonPublic
    );

    var parameters = new object[] {
        "uniqueString",
        new JToken[] {
            (JToken)originalString
        }
    };

    var result = uniqueString.Invoke(null, parameters).ToString();

    return result;

}

您需要下载 Azure Stack Hub 开发工具包并将其解压缩以获取 dll:

  • 下载 https://the.agilesql.club/2017/12/azure-arm-template-function-internals/ - 警告:大约 22Gb!
  • 运行安装程序以解压 55Gb *.vhdx
  • 挂载 *.vhdx,或在本地展开/解包
  • 在 *.vhdx 中,找到此文件并将其解压缩到某处:
    • CloudBuilder\CloudDeployment\NuGetStore\Microsoft.AzureStack.Setup.Services.ResourceManager.5.20.1335.300.nupkg
  • content\Website\bin 中的 *.nupkg 文件夹包含必要的 dll

要使用它们,请添加对 Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.dll 的程序集引用(它对 bin 文件夹中的其他文件有一些依赖性)并且包含 TemplateExpressionBuiltInFunctions 类。上面的代码仅使用反射从该程序集中调用私有 UniqueString 函数,并做了一些工作将参数编组为适当的 JToken 类型。

如果您想深入了解实现细节,您可以对程序集运行反编译器以了解它在幕后做了什么...

注意 - 归功于此博客文章,为我指明了正确的方向:

here