我需要使用以下方式将Sql数据库部署到Azure Sql Server:ARM模板方式,以及使用C#代码的更自定义方式。有一个名为uniqueString(string)
的ARM模板函数,它生成给定字符串的伪随机散列。这是一个确定性的纯函数。
我需要找到一种方法来完全模仿我的C#代码中此函数的行为。即我需要将此功能复制到我的C#代码中。
我在哪里可以找到ARM Api使用的算法?
答案 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:
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
类型。
如果您想深入了解实现细节,您可以对程序集运行反编译器以了解它在幕后做了什么...
注意 - 归功于此博客文章,为我指明了正确的方向: