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”。弹出如下图所示的窗口:

我们要关注的是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 FilesWindows Azure SDKv1.3refMicrosoft.WindowsAzure.CloudDrive.dll的引用。该路径为SDK默认安装路径,如果你不能在这个路径中找到Microsoft.WindowsAzure.CloudDrive.dll请从SDK安装路径中寻找。

步骤三:添加代码

删除并重新创建Default.aspx 页面,然后在Default.aspx.cs中引用命名空间:


1

2

3

4

5

using Microsoft.WindowsAzure;

 

using Microsoft.WindowsAzure.StorageClient;

 

using System.IO;

然后添加下列代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

public partial class Default : System.Web.UI.Page

 

{

 

    string _driveLetter = WebRole.DriveLetter;

 

  

 

    protected void Page_Load(object sender, EventArgs e)

 

    {

 

        if (!IsPostBack)

 

        {

 

            Bind();

 

        }

 

    }

 

  

 

    void Bind()

 

    {

 

        // 显示被Mount的Drive根目录下的所有文件

 

        DirectoryInfo di = new DirectoryInfo(string.Format("{0}", _driveLetter));

 

        this.GridView1.DataSource = di.GetFiles();

 

        this.GridView1.DataBind();

 

    }

 

  

 

    protected void Button1_Click(object sender, EventArgs e)

 

    {

 

        // 在被Mount的Drive根目录下保存文件

 

        if (this.FileUpload1.HasFile)

 

        {

 

            File.WriteAllBytes(string.Format("{0}{1}", _driveLetter, this.FileUpload1.FileName), this.FileUpload1.FileBytes);

 

            Bind();

 

        }

 

    }

 

}

在Default.aspx中添加下列代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<form id="form1" runat="server">

 

  

 

    <asp:FileUpload ID="FileUpload1" runat="server" />

 

    <asp:Button ID="Button1" runat="server" Text="Upload" onclick="Button1_Click" />

 

  

 

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

 

    </asp:GridView>

 

  

 

</form>

接下来在WebRole.cs中引用命名空间:


1

using Microsoft.WindowsAzure.StorageClient;

然后添加下列代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

public class WebRole : RoleEntryPoint

 

{

 

    public static string DriveLetter { get; private set; }

 

    CloudDrive myCloudDrive;

 

  

 

    public override bool OnStart()

 

    {

 

        // 当用配置文件中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.

 

  

 

        return base.OnStart();

 

    }

 

  

 

    public override void  Run()

 

    {

 

        CloudStorageAccount storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

 

  

 

        LocalResource localCache = RoleEnvironment.GetLocalResource("InstanceDriveCache");

 

        CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes);

 

  

 

        // 检查Container是否存在,不存在则创建

 

        CloudBlobClient blobClient = 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();

 

    }

 

  

 

    public override void OnStop()

 

    {

 

        myCloudDrive.Unmount();

 

  

 

        base.OnStop();

 

    }

 

}

最后,修改配置文件。在Cloud Service项目的ServiceConfiguration.cscfg中添加下列配置:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?xml version="1.0" encoding="utf-8"?>

 

<ServiceConfiguration serviceName="WindowsAzureDriveDemonstration"xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">

 

  <Role name="WebRole1">

 

    <Instances count="1" />

 

    <ConfigurationSettings>

 

      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />

 

      <Setting name="DataConnectionString" value="UseDevelopmentStorage=true" />

 

    </ConfigurationSettings>

 

  </Role>

 

</ServiceConfiguration>

在ServiceDefinition.csdef中添加下列配置(注意将Sites部分的内容删除或注释掉):


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<?xml version="1.0" encoding="utf-8"?>

 

<ServiceDefinition name="WindowsAzureDriveDemonstration" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

 

  <WebRole name="WebRole1">

 

    <Sites>

 

      <Site name="Web">

 

        <Bindings>

 

          <Binding name="Endpoint1" endpointName="Endpoint1" />

 

        </Bindings>

 

      </Site>

 

    </Sites>

 

    <Endpoints>

 

      <InputEndpoint name="Endpoint1" protocol="http" port="80" />

 

    </Endpoints>

 

    <Imports>

 

      <Import moduleName="Diagnostics" />

 

    </Imports>

 

    <LocalResources>

 

        <LocalStorage name="InstanceDriveCache" cleanOnRoleRecycle="false" sizeInMB="300" />

 

    </LocalResources>

 

    <ConfigurationSettings>

 

        <Setting name="DataConnectionString" />

 

    </ConfigurationSettings>

 

  </WebRole>

 

</ServiceDefinition>

步骤四:观察并分析代码

步骤三中的代码中,Default.aspx.cs的代码跟普通的ASP.NET项目代码没什么区别。我们把盘符抽离出来以便迁移到Windows Azure上。Default.aspx.cs中的代码跟Windows Azure唯一相关的一句语句就是string driveLetter = WebRole.DriveLetter。我们如果把WebRole.DriveLetter替换为本机盘符该ASP.NET程序将能够正常运行。

后面的代码示范了如何Mount Drive到Blob Storage。此外我们使用了本地缓存来缓存尚未被传递到Blob Storage的文件。

通过上面的例子可以看到,只需额外添加一小段代码,已有的使用NTFS API的程序能够很方便地迁移到Windows Azure平台上。

步骤五:运行程序

运行程序。上传几个文件。如果一切顺利你将看到下图所示的结果。可以看到文件的DirectoryName为“a:”。这就是被Mount到Blob Storage上的Drive的盘符。

需要注意的是,本例中我们并未修改WebRole的实例数,因此只有1个WebRole(发布到云端后将只有一个虚拟机被使用)。如果有两个实例,并且要让两个实例共享一个”网络硬盘“的话,本例中代码将不能正常工作。因为对于同一个Blob同时只能有一个虚拟机Mount。一个可能的解决方案是额外维护一个Web Service来管理Mount和UnMount Drive。进一步的讨论超出了本教学的范围。有兴趣的读者可以下载并参考Windows Azure Cloud Drive白皮书获取信息。

时间: 2024-10-29 04:02:31

Windows Azure入门教学系列 (八):使用Windows Azure Drive的相关文章

Windows Azure入门教学系列 (九):Windows Azure 诊断功能

本文是Windows Azure入门教学的第九篇文章. 本文将会介绍如何使用Windows Azure 诊断功能.跟部署在本地服务器上的程序不同,当我们的程序发布到云端之后,我们不能使用通常的调试方法,例如Remote Debugging等等来对我们的程序进行调试.那么当程序运行出现问题时我们如何能够得知问题的根源以便修正Bug呢?如果我要检测程序的性能,又有什么好的方法呢? 要做到上述的需求,我们需要利用Windows Azure提供的诊断功能,该功能能够记录诊断日志,保存到Windows A

Windows Azure入门教学系列 (七):使用REST API访问Storage Service

本文是Windows Azure入门教学的第七篇文章. 本文将会介绍如何使用REST API来直接访问Storage Service. 在前三篇教学中,我们已经学习了使用Windows Azure SDK所提供的StorageClient来使用Blob Storage, Queue Storage以及Table Storage的基本方法.我们在前几篇教学中也提及最终StorageClient也是通过发送REST请求来与服务器端通信的. 在这篇教学中,我们会以Blob Storage为例,说明如何

Windows Azure入门教学系列 (一): 创建第一个WebRole程序

原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言).在开始学习之前,请确保你的机器上已经安装了: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010) Windows Azure Software Development Kit (November 2009) 步骤

Windows Azure入门教学系列 (五):使用Queue Storage

本文是Windows Azure入门教学的第五篇文章. 本文将会介绍如何使用Queue Storage.Queue Storage提供给我们一个云端的队列.我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信). 一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间.这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后

Windows Azure入门教学系列 (二):部署第一个Web Role程序

本文是Windows Azure入门教学的第二篇文章. 在第一篇教学中,我们已经创建了第一个Web Role程序.在这篇教学中,我们将学习如何把该Web Role程序部署到云端. 注意:您需要购买Windows Azure Platform 服务才能继续本教学.您可以通过点击https://mocp.microsoftonline.com/Site/Support.aspx页面上的   联系我们的支持团队来获得购买服务的具体步骤或询问其他有关购买,收费的问题. 在开始本教学之前,请确保你从Win

Windows Azure入门教学系列 (六):使用Table Storage

本文是Windows Azure入门教学的第六篇文章. 本文将会介绍如何使用Table Storage.Table Storage提供给我们一个云端的表格结构.我们可以把他想象为XML文件或者是一个轻量级的数据库(当然,不是通过SQL 语句进行数据的操作). 使用Table Storage的方法依然是调用REST API.有关Table Storage REST API的详细信息,请参见Table服务API: 为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzu

Windows Azure入门教学系列 (四):使用Blob Storage

本文将会介绍如何使用Blob Storage.Blob Storage可以看做是云端的文件系统.与桌面操作系统上不同,我们是通过REST API来进行对文件的操作.有关REST API的详细信息,请参见Blob 服务 API. 为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求. 在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows Azure开发工具.本教学使

Windows Azure入门教学系列 (一): 创建第一个WebRole程序,互联网营销

在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言).在开始学习之前,请确保你的机器上已经安装了: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010) Windows Azure Software Development Kit (November 2009) 步骤一:创建解决方案和项目 以管理员权限打开Visual Studio 2008 SP1,

Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service

本文是Windows Azure AppFabric入门教学的第五篇文章.本文会对AppFabric中的Access Control Service(ACS)做初步的讲解.为了使后续的学习顺利进行请确保已浏览本教程的第一篇文章,并以按照该文完成了AppFabric项目和命名空间的创建.我们知道,AppFabirc由Service Bus 和 Access Control Service组成,在前一篇教程中我们已介绍过Service Bus,所以本文将简略的介绍如何使用ACS服务来确保安全性. 同