设为首页 收藏本站
查看: 1304|回复: 0

[经验分享] Windows Azure入门教学系列 (八):使用Windows Azure Drive

[复制链接]

尚未签到

发表于 2016-5-23 08:11:00 | 显示全部楼层 |阅读模式
公告:本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题,会影响阅读体验。如遇此情况,请访问原博客。




  本文是Windows Azure入门教学的第八篇文章。
本文将会介绍如何使用Windows Azure Drive。
我们知道,由于云端的特殊性,通常情况下,对文件系统的读写建议使用Blob Storage来代替。这就产生了一个问题:对于一个已经写好的本地应用程序,其中使用了NTFS API对本地文件系统读写的代码是否需要进行完全重写以便迁移到Windows Azure平台上呢?答案是否定的。Windows Azure平台提供了Drive的功能。
在1.1版本的SDK中提供了CloudDrive类,能够将本地NTFS文件系统Mount到Blob Storage上。我们只要添加一小段代码来表明我们希望Mount Drive到Blob Storage上就能重用大部分已有的对本地文件系统访问的代码。这样,我们已有的程序能够无缝地迁移到Windows Azure上而不需要做大的改动。
在开始本教学之前,请确保你从Windows Azure平台下载下载并安装了最新的Windows Azure开发工具。本教学使用Visual Studio 2010作为开发工具。
步骤一:创建解决方案和项目
由于我们要在本地模拟环境下测试Windows Azure Drive,首先,请确保Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让Visual Studio 2010帮助我们启动他。
右击工具栏中Windows Azure模拟器的图标,选择”Show Storage Emulator UI”。弹出如下图所示的窗口:


DSC0000.png 我们要关注的是Service management中Blob所在的一行。要确保Status为Running。
确认完毕后启动Visual Studio 2010,新建一个Cloud Service项目并为之添加一个Web Role。
步骤二:添加SDK程序集引用
请在项目属性页里确认项目的Target framework的值是.NET Framework 4或.NET Framework 3.5。然后在Web Role项目中添加对C:\Program Files\Windows Azure SDK\v1.3\ref\Microsoft.WindowsAzure.CloudDrive.dll的引用。该路径为SDK默认安装路径,如果你不能在这个路径中找到Microsoft.WindowsAzure.CloudDrive.dll请从SDK安装路径中寻找。
步骤三:添加代码
删除并重新创建Default.aspx页面,然后在Default.aspx.cs中引用命名空间:
usingMicrosoft.WindowsAzure;
usingMicrosoft.WindowsAzure.StorageClient;
usingSystem.IO;

然后添加下列代码:

publicpartialclassDefault: System.Web.UI.Page
{
string_driveLetter =WebRole.DriveLetter;

protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
Bind();
}
}

voidBind()
{
//显示被MountDrive根目录下的所有文件
DirectoryInfodi =newDirectoryInfo(string.Format("{0}\\", _driveLetter));
this.GridView1.DataSource = di.GetFiles();
this.GridView1.DataBind();
}

protectedvoidButton1_Click(objectsender,EventArgse)
{
//在被MountDrive根目录下保存文件
if(this.FileUpload1.HasFile)
{
File.WriteAllBytes(string.Format("{0}\\{1}", _driveLetter,this.FileUpload1.FileName),this.FileUpload1.FileBytes);
Bind();
}
}
}

在Default.aspx中添加下列代码:
<formid="form1"runat="server">

<asp:FileUploadID="FileUpload1"runat="server"/>
<asp:ButtonID="Button1"runat="server"Text="Upload"onclick="Button1_Click"/>

<asp:GridViewAllowPaging="true"PageSize="20"ID="GridView1"runat="server">
</asp:GridView>

</form>

接下来在WebRole.cs中引用命名空间:
usingMicrosoft.WindowsAzure.StorageClient;

然后添加下列代码:
publicclassWebRole:RoleEntryPoint
{
publicstaticstringDriveLetter {get;privateset; }
CloudDrivemyCloudDrive;

publicoverrideboolOnStart()
{
//当用配置文件中ConfigurationSettings时必须调用CloudStorageAccount.SetConfigurationSettingPublisher
//来说明当配置文件在发布后被更改时将采取何种操作
CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{

configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));

RoleEnvironment.Changed += (sender, arg) =>
{
if(arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
.Any((change) => (change.ConfigurationSettingName == configName)))
{

if(!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
{
RoleEnvironment.RequestRecycle();
}
}
};
});

// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

returnbase.OnStart();
}

publicoverridevoidRun()
{
CloudStorageAccountstorageAccount =CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

LocalResourcelocalCache =RoleEnvironment.GetLocalResource("InstanceDriveCache");
CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes);

//检查Container是否存在,不存在则创建
CloudBlobClientblobClient = storageAccount.CreateCloudBlobClient();
blobClient.GetContainerReference("drives").CreateIfNotExist();

//创建Cloud Drive
myCloudDrive = storageAccount.CreateCloudDrive(
blobClient
.GetContainerReference("drives")
.GetPageBlobReference("mydrive.vhd")
.Uri.ToString()
);

try
{
myCloudDrive.Create(64);

}
catch(CloudDriveException)
{

}
DriveLetter = myCloudDrive.Mount(0,DriveMountOptions.Force);

base.Run();
}

publicoverridevoidOnStop()
{
myCloudDrive.Unmount();

base.OnStop();
}
}

最后,修改配置文件。在Cloud Service项目的ServiceConfiguration.cscfg中添加下列配置:
<?xmlversion="1.0"encoding="utf-8"?>
<ServiceConfigurationserviceName="WindowsAzureDriveDemonstration"xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"osFamily="1"osVersion="*">
<Rolename="WebRole1">
<Instancescount="1"/>
<ConfigurationSettings>
<Settingname="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"value="UseDevelopmentStorage=true"/>
<Settingname="DataConnectionString"value="UseDevelopmentStorage=true"/>
</ConfigurationSettings>
</Role>
</ServiceConfiguration>

在ServiceDefinition.csdef中添加下列配置(注意将Sites部分的内容删除或注释掉):
<?xmlversion="1.0"encoding="utf-8"?>
<ServiceDefinitionname="WindowsAzureDriveDemonstration"xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRolename="WebRole1">
<Sites>
<Sitename="Web">
<Bindings>
<Bindingname="Endpoint1"endpointName="Endpoint1"/>
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpointname="Endpoint1"protocol="http"port="80"/>
</Endpoints>
<Imports>
<ImportmoduleName="Diagnostics"/>
</Imports>
<LocalResources>
<LocalStoragename="InstanceDriveCache"cleanOnRoleRecycle="false"sizeInMB="300"/>
</LocalResources>
<ConfigurationSettings>
<Settingname="DataConnectionString"/>
</ConfigurationSettings>
</WebRole>
</ServiceDefinition>

步骤四:观察并分析代码
步骤三中的代码中,Default.aspx.cs的代码跟普通的ASP.NET项目代码没什么区别。我们把盘符抽离出来以便迁移到Windows Azure上。Default.aspx.cs中的代码跟Windows Azure唯一相关的一句语句就是stringdriveLetter =WebRole.DriveLetter。我们如果把WebRole.DriveLetter替换为本机盘符该ASP.NET程序将能够正常运行。
后面的代码示范了如何Mount Drive到Blob Storage。此外我们使用了本地缓存来缓存尚未被传递到Blob Storage的文件。
通过上面的例子可以看到,只需额外添加一小段代码,已有的使用NTFS API的程序能够很方便地迁移到Windows Azure平台上。
步骤五:运行程序
运行程序。上传几个文件。如果一切顺利你将看到下图所示的结果。可以看到文件的DirectoryName为“a:\”。这就是被Mount到Blob Storage上的Drive的盘符。
DSC0001.png
需要注意的是,本例中我们并未修改WebRole的实例数,因此只有1个WebRole(发布到云端后将只有一个虚拟机被使用)。如果有两个实例,并且要让两个实例共享一个”网络硬盘“的话,本例中代码将不能正常工作。因为对于同一个Blob同时只能有一个虚拟机Mount。一个可能的解决方案是额外维护一个Web Service来管理Mount和UnMount Drive。进一步的讨论超出了本教学的范围。有兴趣的读者可以下载并参考Windows Azure Cloud Drive白皮书获取信息。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-220498-1-1.html 上篇帖子: Windows Azure 之 Hello World 下篇帖子: 微软Windows Azure平台资源汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表