使用 Azure 存储模拟器进行开发和测试(已弃用)

Azure 存储模拟器是一种工具,用于模拟用于本地开发的Azure Blob、队列和表服务。 可以在本地针对存储服务测试应用程序,而无需创建 Azure 订阅且不会产生任何费用。 如果对应用程序在模拟器中的工作情况感到满意,则可以切换到在云中使用 Azure 存储帐户。

Important

现已弃用 Azure 存储模拟器。 建议将 Azurite 模拟器用于Azure 存储进行本地开发。 Azurite 取代了 Azure 存储仿真器。 Azurite 将持续更新,以支持最新版本的 Azure 存储 API。 有关详细信息,请参阅“使用 Azurite 模拟器进行本地 Azure 存储开发”

获取存储模拟器

存储模拟器作为 Microsoft Azure SDK 的一部分提供。 此外,还可使用独立安装程序(直接下载)来安装存储模拟器。 若要安装存储模拟器,必须在计算机上拥有管理权限。

存储模拟器目前仅在 Windows 上运行。 对于 Linux 上的模拟,请使用 Azurite 模拟器。

Note

在某一版本的 Storage Emulator 中创建的数据,在使用其他版本时不保证可访问。 如果你需要长期保存数据,建议把数据存储在 Azure 存储账户里,而不是存储模拟器里。

存储模拟器依赖于特定版本的 OData 库。 将存储模拟器所使用的 OData DLL 替换为其他版本的做法不受支持,并且可能导致不可预期的行为。 然而,存储服务支持的任何 OData 版本都可以用来向模拟器发送请求。

存储模拟器的工作原理

存储模拟器使用本地 Microsoft SQL Server 2012 Express LocalDB 实例来模拟 Azure 存储服务。 可以选择将存储模拟器配置为访问 SQL Server 的本地实例而不是 LocalDB 实例。 有关详细信息,请参阅本文稍后的启动并初始化存储模拟器部分。

存储仿真器通过使用 Windows 身份验证 连接到 SQL Server 或 LocalDB。

存储模拟器与 Azure 存储服务之间存在一些功能差异。 有关这些差异的详细信息,请参阅本文后面的存储模拟器与 Azure 存储之间的差异部分。

启动和初始化存储模拟器

若要启动 Azure 存储模拟器:

  1. 选择“开始”按钮或按“Windows”键。
  2. 开始键入 Azure 存储 Emulator
  3. 从所示应用程序的列表中选择该模拟器。

当存储模拟器启动时,会出现命令提示符窗口。 用这个控制台窗口启动和停止存储模拟器。 还可以从命令提示符清除数据、获取状态和初始化模拟器。 有关详细信息,请参阅本文后面的存储模拟器命令行工具参考部分。

Note

如果系统上运行着其他存储模拟器,比如 Azurite,Azure 存储 模拟器可能无法正常启动。

当模拟器运行时,你会在Windows任务栏通知区看到一个图标。

当你关闭存储模拟器的命令提示符窗口时,存储模拟器会继续运行。 若要重新显示“存储模拟器”控制台窗口,请执行上述步骤,就像启动存储模拟器一样。

第一次运行存储模拟器时,它会初始化本地存储环境。 初始化过程在 LocalDB 中创建一个数据库,并为每个本地存储服务保留 HTTP 端口。

存储模拟器的默认安装路径为 C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator

Tip

使用 Microsoft Azure 存储资源管理器 来处理本地的 Storage Emulator 资源。 安装并启动存储模拟器后,在 存储资源管理器 资源树的 Local & Attached 下查找 (Emulator - Default Ports) (Key)

初始化存储模拟器以使用不同的SQL数据库

使用存储模拟器命令行工具初始化存储模拟器,使其指向默认 LocalDB 实例以外的 SQL 数据库实例:

  1. 启动和初始化存储模拟器部分所述,打开“存储模拟器”控制台窗口。

  2. 在控制台窗口中,键入以下命令,其中 <SQLServerInstance> 是 SQL Server 实例的名称。 若要使用 LocalDB,请指定 (localdb)\MSSQLLocalDb 作为 SQL Server 实例。

    AzureStorageEmulator.exe init /server <SQLServerInstance>

    也可以使用以下命令,该命令指示模拟器使用默认 SQL Server 实例:

    AzureStorageEmulator.exe init /server .

    或者,可以使用以下命令将数据库重新初始化为默认的 LocalDB 实例:

    AzureStorageEmulator.exe init /forceCreate

有关这些命令的详细信息,请参阅存储模拟器命令行工具参考

Tip

使用Microsoft SQL Server Management Studio(SSMS)来管理您的SQL Server实例,包括LocalDB安装。 在 SSMS 的“连接服务器”对话框中,在服务器名称字段中指定(localdb)\MSSQLLocalDb连接 LocalDB 实例。

针对存储模拟器对请求进行身份验证

安装并启动存储模拟器后,你可以用它测试你的代码。 针对存储模拟器发出的每个请求都必须经过授权,除非它是匿名请求。 通过共享密钥认证或共享访问签名(SAS)授权对存储仿真器的请求。

使用共享密钥凭据进行授权

模拟器支持一个固定账户和一个众所周知的密钥用于共享密钥验证。 此帐户和密钥是允许用于模拟器的唯一共享密钥凭据。 它们分别是:

Account name: devstoreaccount1
Account key: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

Note

模拟器支持的身份验证密钥仅用于测试客户端身份验证代码的功能。 它没有任何安全用途。 不能在模拟器中使用生产存储帐户和密钥。 不应将开发账户用于处理生产数据。

模拟器仅支持通过 HTTP 进行连接。 但是,若要访问生产性 Azure 存储帐户中的资源,建议使用 HTTPS 协议。

使用快捷方式连接到模拟器帐户

从应用程序连接到模拟器的最简单方法是在应用程序的配置文件中配置一个连接字符串,该字符串引用快捷方式UseDevelopmentStorage=true。 该快捷方式等效于模拟器的完整连接字符串,该字符串指定每个 Azure 存储服务的帐户名、帐户密钥和模拟器终结点:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
EndpointSuffix=core.chinacloudapi.cn;
BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;
QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;
TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;

下面的 .NET 代码片段显示了如何通过采用连接字符串的方法使用该快捷方式。 例如,BlobContainerClient(String, String) 构造函数使用连接字符串。

BlobContainerClient blobContainerClient = new BlobContainerClient("UseDevelopmentStorage=true", "sample-container");
blobContainerClient.CreateIfNotExists();

在调用代码片段中的代码之前,请确保模拟器正在运行。

有关连接字符串的详细信息,请参阅配置 Azure 存储连接字符串

使用共享访问签名进行授权

Note

建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

您可以使用 存储资源管理器 或其他支持共享密钥认证的应用程序创建 SAS 令牌。

还可使用 Azure PowerShell 来生成 SAS 令牌。 以下示例生成一个对 Blob 容器具有完整权限的 SAS 令牌:

  1. 若尚未安装 Azure PowerShell,请进行安装(建议使用最新版 Azure PowerShell cmdlet 安装)。 有关安装说明,请参阅安装和配置 Azure PowerShell
  2. 打开 Azure PowerShell 并运行以下命令,将 CONTAINER_NAME 替换为所选名称:
$context = New-AzStorageContext -Local

New-AzStorageContainer CONTAINER_NAME -Permission Off -Context $context

$now = Get-Date

New-AzStorageContainerSASToken -Name CONTAINER_NAME -Permission rwdl -ExpiryTime $now.AddDays(1.0) -Context $context -FullUri

得到的新容器的共享访问签名 URI 应类似于以下内容:

http://127.0.0.1:10000/devstoreaccount1/sascontainer?sv=2012-02-12&se=2015-07-08T00%3A12%3A08Z&sr=c&sp=rwdl&sig=t%2BbzU9%2B7ry4okULN9S0wst/8MCUhTjrHyV9rDNLSe8g%3D

此示例中创建的共享访问签名的有效期为一天。 该签名将授予对容器内 Blob 的完整访问权限(读取、写入、删除和列出)。

有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限

对存储模拟器中的资源进行寻址

存储模拟器的服务终结点不同于 Azure 存储帐户的终结点。 本地计算机不做域名解析,所以存储模拟器的端点是本地地址。

对 Azure 存储帐户中的资源进行寻址时,请使用以下方案。 帐户名称是 URI 主机名的一部分,要寻址的资源是 URI 路径的一部分:

<http|https>://<account-name>.<service-name>.core.chinacloudapi.cn/<resource-path>

例如,下面的 URI 是 Azure 存储帐户的 Blob 中的有效地址:

https://myaccount.blob.core.chinacloudapi.cn/mycontainer/myblob.txt

由于本地计算机不执行域名解析,帐户名称是 URI 路径的一部分,而不是主机名的一部分。 可对存储模拟器中的资源使用以下 URI 格式:

http://<local-machine-address>:<port>/<account-name>/<resource-path>

例如,以下地址可用于访问存储模拟器中的 blob:

http://127.0.0.1:10000/myaccount/mycontainer/myblob.txt

存储模拟器的服务终结点是:

  • Blob 服务:http://127.0.0.1:10000/<account-name>/<resource-path>
  • 队列服务:http://127.0.0.1:10001/<account-name>/<resource-path>
  • 表服务:http://127.0.0.1:10002/<account-name>/<resource-path>

使用 RA-GRS 对帐户辅助副本进行寻址

从3.1版本开始,存储模拟器支持读取访问地理冗余存储(RA-GRS)。 你可以通过在账户名称后附加 -secondary 来访问辅助位置。 例如,使用以下地址通过存储模拟器的只读次级访问blob:

http://127.0.0.1:10000/myaccount-secondary/mycontainer/myblob.txt

Note

若要使用存储模拟器以编程方式访问次要副本,请使用适用于 .NET 的存储客户端库 3.2 版或更高版本。 请参阅适用于 .NET 的 Microsoft Azure 存储客户端库,获取详细信息。

存储模拟器命令行工具参考

从3.0版本开始,启动存储模拟器时会显示一个控制台窗口。 使用控制台窗口中的命令行启动和停止模拟器。 你也可以查询状态并从命令行执行其他操作。

Note

如果已安装Azure计算模拟器,则启动存储模拟器时会显示系统托盘图标。 右键点击图标,会显示一个菜单,提供图形化的方式来启动和停止存储模拟器。

命令行语法

AzureStorageEmulator.exe [start] [stop] [status] [clear] [init] [help]

选项

若要查看选项列表,请在命令提示符下键入 /help

Option Description Command Arguments
启动 启动存储模拟器。 AzureStorageEmulator.exe start [-inprocess] -inprocess:在当前进程中启动仿真器,而不是创建新进程。
停止 停止存储模拟器。 AzureStorageEmulator.exe stop
Status 输出存储模拟器的状态。 AzureStorageEmulator.exe status
清除 清除命令行上指定的所有服务中的数据。 AzureStorageEmulator.exe clear [blob] [table] [queue] [all] blob:清除 Blob 数据。
queue:清除队列数据。
table:清除表数据。
all:清除所有服务中的所有数据。
Init 执行一次性初始化以设置模拟器。 AzureStorageEmulator.exe init [-server serverName] [-sqlinstance instanceName] [-forcecreate|-skipcreate] [-reserveports|-unreserveports] [-inprocess] -server serverName\instanceName:指定托管 SQL 实例的服务器。
-sqlinstance instanceName:指定在默认服务器实例中使用的SQL实例名称。
-forcecreate:强制创建 SQL 数据库,即使它已存在。
-skipcreate:跳过创建 SQL 数据库的步骤。 该论证优先于-forcecreate。
-reserveports:尝试保留与服务关联的 HTTP 端口。
-unreserveports:尝试取消预留与服务关联的 HTTP 端口。 此参数的优先级高于 -reserveports。
-inprocess:在当前进程中执行初始化,而不是生成新的进程。 如果更改端口预留,必须使用提升的权限启动当前进程。

存储模拟器与 Azure 存储之间的差异

由于存储模拟器是本地模拟环境,因此在云中使用模拟器和 Azure 存储帐户会存在一些差异:

  • 存储模拟器只支持单一固定的帐户和众所周知的身份验证密钥。
  • 存储模拟器不是可缩放的存储服务,并且不支持大量并发客户端。
  • 对存储模拟器中的资源进行寻址中所述,存储模拟器与 Azure 存储帐户中的资源以不同方式寻址。 区别在于域名解析存在于云端,而本地计算机无法解析。
  • 从 3.1 版本开始,存储模拟器帐户支持可读访问异地冗余存储(RA-GRS)。 在模拟器中,所有帐户都已启用 RA-GRS,在主要和次要副本之间不会有任何延迟。 获取 Blob 服务统计信息、获取队列服务统计信息和获取表服务统计信息操作受账户辅助终结点支持,并且始终将 LastSyncTime 响应元素的值返回为底层 SQL 数据库中的当前时间。
  • 文件服务和 SMB 协议服务终结点当前在存储模拟器中不受支持。
  • 如果你使用模拟器不支持的存储服务版本,模拟器会返回 VersionNotSupportedByEmulator 错误(HTTP 状态代码 400 - 错误请求)。

Blob 存储的差异

以下差异适用于模拟器中的 Blob 存储:

  • 存储模拟器仅支持最大为 2 GB 的 Blob。
  • 存储模拟器中 blob 名称的最大长度为 256 个字符,而 Azure 存储中 blob 名称的最大长度为 1024 个字符。
  • 增量复制允许复制已被覆盖的 blob 的快照,但该操作会在服务端返回失败。
  • “Get Page Ranges Diff”在通过 Incremental Copy Blob 复制的快照之间不起作用。
  • 对于存在于存储模拟器中且具有有效租约的 Blob,Put Blob 操作可能会成功,即使请求中未指定租约 ID。
  • 追加 Blob 操作不受模拟器支持。 尝试对追加 Blob 执行操作时,会返回 FeatureNotSupportedByEmulator 错误(HTTP 状态代码 400(Bad Request))。

表存储的差异

以下差异适用于模拟器中的表存储:

  • 存储模拟器中表服务的日期属性仅支持 SQL Server 2005 所支持的范围(要求其晚于 1753 年 1 月 1 日)。 1753 年 1 月 1 日之前的所有日期都会更改为此值。 日期的精度仅限于 SQL Server 2005 的精度,这意味着日期将精确到 1/300 秒。
  • 存储模拟器支持每个都小于 512 个字节的分区键和行键属性值。 帐户名称、表名和键属性名称合在一起的总大小不能超过 900 个字节。
  • 存储模拟器的表中的某行的总大小被限制为小于 1 MB。
  • 在存储模拟器中,数据类型 Edm.GuidEdm.Binary 的属性仅支持查询筛选器字符串中的 Equal (eq)NotEqual (ne) 比较运算符。

队列存储的差异

模拟器中没有队列存储特有的差异。

存储模拟器发行说明

版本 5.10

  • 存储模拟器不会拒绝 Blob、队列和表服务终结点上版本为 2019-07-07 的存储服务。

版本 5.9

  • 存储模拟器不会拒绝Blob、队列和表服务端点的2019-02-02版本存储服务。

版本 5.8

  • 存储模拟器不会拒绝 Blob、Queue 和 Table 服务端点上的 2018-11-09 版本存储服务请求。

版本 5.7

  • 修复了一个在启用日志记录时会导致崩溃的缺陷。

版本 5.6

  • 存储模拟器支持 Blob、Queue 和 Table 服务终结点上的 2018-03-28 版本存储服务。

版本 5.5

  • 存储模拟器支持 Blob、队列和表服务终结点上的存储服务的 2017-11-09 版本。
  • 新增了对 Blob 已创建 属性的支持,该属性返回了 blob 的创建时间。

版本 5.4

  • 为了提高安装稳定性,模拟器在安装时不再尝试预留端口。 如果你想要端口保留,可以用-reserveportsinit命令来指定端口。

版本 5.3

  • 存储模拟器支持Blob、队列和表服务端点的存储服务版本2017-07-29。

版本 5.2

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2017-04-17 版存储服务。
  • 修复了表属性值未正确编码的 bug。

版本 5.1

  • 修复了一个问题:在某些响应中,存储模拟器会返回 DataServiceVersion 标头,而服务本身并不会返回该标头。

版本 5.0

  • 存储模拟器安装程序不再检查现有的 MSSQL 和 .NET Framework 安装。
  • 存储模拟器安装程序不再在安装过程中创建数据库。 安装程序仍会在启动过程中根据需要创建数据库。
  • 创建数据库不再需要提升权限。
  • 启动时不再需要预留端口。
  • 将以下选项添加到 init-reserveports(需提升)、-unreserveports(需提升)、-skipcreate
  • 系统托盘图标上的“存储模拟器 UI”选项现在可启动命令行接口。 不再提供旧的 GUI。
  • 删除或重命名了某些 DLL。

版本 4.6

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2016-05-31 版本的存储服务。

版本 4.5

  • 修复了重命名后备数据库时导致安装和初始化失败的 bug。

版本 4.4

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2015-12-11 版本的存储服务。
  • 现在,在处理大量 blob 时,存储模拟器的 blob 数据垃圾回收效率更高了。
  • 修复了导致容器 ACL XML 的验证方式与存储服务的验证方式稍有不同的 bug。
  • 修复了一个错误,该错误有时会导致 DateTime 类型的最大值和最小值显示在错误的时区中。

版本 4.3

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2015-07-08 版本的存储服务。

版本 4.2

  • 存储模拟器现在支持 Blob、Queue 和 Table 服务终结点上的 2015-04-05 版本的存储服务。

版本 4.1

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2015-02-21 版本的存储服务。 它不支持新的“追加 Blob”功能。
  • 对于不支持的存储服务版本,模拟器现在会返回有意义的错误消息。 使用最新版本的模拟器。 如果收到 VersionNotSupportedByEmulator 错误(HTTP 状态代码 400 - 错误的请求),请下载最新版本的模拟器。
  • 修复了一个缺陷:在并发合并操作期间,竞争条件会导致表实体数据不正确。

4.0 版

  • 存储模拟器可执行文件已重命名为 AzureStorageEmulator.exe

版本 3.2

  • 存储模拟器现在支持 Blob、队列和表服务终结点上的 2014-02-14 版本的存储服务。 文件服务终结点目前在存储模拟器中不受支持。 请参阅 Versioning for the Azure 存储 Services(Azure 存储服务的版本控制)以了解有关 2014-02-14 版本的详细信息。

版本 3.1

  • 存储模拟器现在支持读取访问地理冗余存储(RA-GRS)。 它支持 Get Blob Service StatsGet Queue Service StatsGet Table Service Stats 账户次级的 API,并且始终根据底层 SQL 数据库返回响应元素的当前时间 LastSyncTime 值。 若要使用存储模拟器以编程方式访问次要副本,请使用适用于 .NET 的存储客户端库 3.2 版或更高版本。 欲了解更多信息,请参见.NET的Azure 存储客户端库

版本 3.0

  • Azure 存储 Emulator 不再包含在与计算模拟器同一个包中。
  • 存储模拟器图形用户界面已弃用。 Microsoft 用可脚本的命令行界面取代了它。 关于命令行界面的详细信息,请参见 Storage Emulator Command-Line 工具参考。 图形界面保留在3.0版本中,但只有安装了计算模拟器后才能访问。 要访问它,右键点击系统托盘图标,选择 “显示存储模拟器界面”。
  • 存储模拟器现已完全支持 Azure 存储服务版本2013-08-15。 (此前,该版本仅由Storage Emulator 2.2.1预览版支持。)

后续步骤