Сопоставление файловой службы Azure CloudFileShare как виртуального каталога в каждом экземпляре облачной службы
У меня есть облачная служба Azure, которую я пытаюсь обновить для обеспечения высокой доступности, и я подписался на предварительный просмотр файловой службы Microsoft Azure, который был включен на портале предварительного просмотра. Я создал новую учетную запись хранения и вижу, что учетная запись хранения теперь имеет конечную точку Files, расположенную по адресу:
https://<account-name>.file.core.windows.net/
В моей веб-роли есть следующий код, который проверяет, создан ли общий ресурс scorm и, если нет, то он его создает:
public static void CreateCloudShare()
{
CloudStorageAccount account = CloudStorageAccount.Parse(System.Configuration.ConfigurationManager.AppSettings["SecondaryStorageConnectionString"].ToString());
CloudFileClient client = account.CreateCloudFileClient();
CloudFileShare share = client.GetShareReference("scorm");
share.CreateIfNotExistsAsync().Wait();
}
Это работает без проблем. Моя проблема в том, что я не уверен, как сопоставить CloudShare, который был создан как виртуальный каталог в моей облачной службе. В одном случае я смог сделать это:
public static void CreateVirtualDirectory(string VDirName, string physicalPath)
{
try
{
if (VDirName[0] != '/')
VDirName = "/" + VDirName;
using (var serverManager = new ServerManager())
{
string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_" + "Web";
//Site theSite = serverManager.Sites[siteName];
Site theSite = serverManager.Sites[0];
foreach (var app in theSite.Applications)
{
if (app.Path == VDirName)
{
// already exists
return;
}
}
Microsoft.Web.Administration.VirtualDirectory vDir = theSite.Applications[0].VirtualDirectories.Add(VDirName, physicalPath);
serverManager.CommitChanges();
}
}
catch (Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("Application", ex.Message, System.Diagnostics.EventLogEntryType.Error);
//System.Diagnostics.EventLog.WriteEntry("Application", ex.InnerException.Message, System.Diagnostics.EventLogEntryType.Error);
}
}
Я посмотрел и увидел, что это можно отобразить с помощью powershell, но я не уверен, как я мог бы вызывать код в моей веб-роли. Я добавил следующий метод для запуска кода powershell:
public static int ExecuteCommand(string exe, string arguments, out string error, int timeout)
{
Process p = new Process();
int exitCode;
p.StartInfo.FileName = exe;
p.StartInfo.Arguments = arguments;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.Start();
error = p.StandardError.ReadToEnd();
p.WaitForExit(timeout);
exitCode = p.ExitCode;
p.Close();
return exitCode;
}
Я знаю, что команда, которую я должен выполнить:
net use z: \\<account-name>.file.core.windows.net\scorm /u:<account-name> <account-key>
Как я могу использовать это в моей веб-роли? Мой код веб-роли выглядит следующим образом, но, похоже, не работает:
public override bool OnStart()
{
try
{
CreateCloudShare();
ExecuteCommand("net.exe", "user " + userName + " " + password + " /add", out error, 10000);
ExecuteCommand("netsh.exe", "firewall set service type=fileandprint mode=enable scope=all", out error, 10000);
ExecuteCommand("net.exe", " share " + shareName + "=" + path + " /Grant:" + userName + ",full", out error, 10000);
}
catch (Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("Application", "CREATE CLOUD SHARE ERROR : " + ex.Message, System.Diagnostics.EventLogEntryType.Error);
}
return base.OnStart();
}
2 ответа
В нашем блоге " Постоянные подключения к файлам Microsoft Azure " приведен пример ссылки на общие ресурсы Azure Files из веб-страниц и рабочих ролей. См. Раздел "Роли Windows PaaS", а также ознакомьтесь с примечанием в разделе "Роли в Интернете и контексты пользователя".
Библиотека RedDog.Storage позволяет легко смонтировать диск в облачной службе, не беспокоясь о P / Invoke:
Install-Package RedDog.Storage
После установки пакета вы можете просто использовать метод расширения "Mount" в CloudFileShare:
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// Mount a drive.
FilesMappedDrive.Mount("P:", @"\\acc.file.core.windows.net\reports", "sandibox",
"key");
// Unmount a drive.
FilesMappedDrive.Unmount("P:");
// Mount a drive for a CloudFileShare.
CloudFileShare share = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"))
.CreateCloudFileClient()
.GetShareReference("reports");
share.Mount("P:");
// List drives mapped to an Azure Files share.
foreach (var mappedDrive in FilesMappedDrive.GetMountedShares())
{
Trace.WriteLine(String.Format("{0} - {1}", mappedDrive.DriveLetter, mappedDrive.Path));
}
return base.OnStart();
}
}
Дополнительная информация: http://fabriccontroller.net/blog/posts/using-the-azure-file-service-in-your-cloud-services-web-roles-and-worker-role/