Azure 存储仿真器错误且无法启动。

75

这个错误真的让我疯了。(在管理员模式下运行的终端)

在 SQL Server 2014 中初始化 Azure 存储仿真器:

C:\Program Files (x86)\Microsoft SDKs\Windows Azure\Storage Emulator>.\wastorage
emulator init -server MY-PC
Windows Azure Storage Emulator 3.0.0.0 command line tool
The storage emulator was successfully initialized and is ready to use.

启动服务器时出错:

C:\Program Files (x86)\Microsoft SDKs\Windows Azure\Storage Emulator>.\wastorage
emulator start
Windows Azure Storage Emulator 3.0.0.0 command line tool

Unhandled Exception: System.TimeoutException: Unable to open wait handle.
   at Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll
er.InternalWaitForStorageEmulator(Int32 timeoutInMilliseconds)
   at Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll
er.EnsureRunning(Int32 timeoutInMilliseconds)
   at Microsoft.WindowsAzure.Storage.Emulator.StartCommand.RunCommand()
   at Microsoft.WindowsAzure.Storage.Emulator.Program.Main(String[] args)

最终,我只需更新到最新的VS版本和SDK即可解决这个问题。 - BigChief
29个回答

169

14
你刚刚帮我们节省了很多时间。 - Andre Pena
27
我想知道微软的开发人员是如何构建他们的应用程序的。与其使用不清楚的TimeoutException,不如让应用程序抛出“端口不可用”异常?! - Jalal El-Shaer
1
值得一提的是,可以不加上“-p tcp”来运行。对我来说,这是Google Keep。 - irwinb
谢谢,你让我的一天变得美好。 - Elvis
1
如果您不喜欢CLI,请按WinLogo+R %windir%\system32\perfmon.exe /res(或从任务管理器的性能选项卡中打开资源管理器),网络选项卡-> tcp连接/监听端口。 - BigChief
1
对于那些在2022年发现这个问题的人,由于某种原因,Azurite已经出现在我的计算机上了,我猜测是由于一个VS更新,这就是占用端口的原因! - Dale Francis

48
总结并补充其他回答这个问题的要点。
在记事本或者Notepad++编辑器中打开C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe.config文件。 查看services部分。
<services>
  <service name="Blob" url="http://127.0.0.1:10000/"/>
  <service name="Queue" url="http://127.0.0.1:10001/"/>
  <service name="Table" url="http://127.0.0.1:10002/"/>
</services>

尝试在网络浏览器中打开“Blob”的URL。 在我的情况下,它是
http://127.0.0.1:10000/

如果您无法打开URL或出现错误,这就是您无法启动Azure存储模拟器的原因。
请尝试以下步骤解决此问题。
  1. 检查端口10000是否被占用或被其他进程使用。
要了解此情况,您可以在命令提示符中键入以下命令。
netstat -na | find "10000"

杀掉进程。
现在以-inprocess模式启动Azure存储模拟器。
在Azure存储模拟器的命令提示符中输入以下内容:
AzureStorageEmulator.exe start -inprocess
按下Ctrl+c,然后执行以下操作:
AzureStorageEmulator.exe start
如果问题没有解决,请尝试第二步。
2. 运行以下命令:
netsh http add iplisten 127.0.0.1
然后在Azure存储模拟器的命令提示符中输入以下内容:
AzureStorageEmulator.exe start -inprocess
按下Ctrl+c,然后执行以下操作:
AzureStorageEmulator.exe start

1
非常感谢这个帮助 - 其他在不同问题上得到高赞的答案没有详细说明netsh选项。 - Ryanman
1
我在尝试本地调试Azure函数时遇到了这个问题,然后(2)对我有用。非常感谢! - The Inquisitive Coder
2
这个终于对我起作用了(第二步)。它到底是在做什么: netsh http add iplisten 127.0.0.1 - open-collar
#2 可以运行,但我不知道为什么。 - Marz
只需要运行 AzureStorageEmulator.exe start 就可以了。 - The Muffin Man
显示剩余2条评论

22

问题可能是端口10000被占用了。存储模拟器运行在端口10000上。因此,您需要终止该进程。在Windows上,以管理员身份打开cmd并运行以下命令。

首先找到占用端口10000的进程

netstat -ano | findstr :10000

结束进程

taskkill /PID <process id> /F

现在尝试再次启动模拟器。


17

在 Azure 工具更新(版本为 2.3)后,我遇到了相同的问题。经过数小时的研究,我发现了一个奇怪的解决方案 - 将“开始 Windows Azure 存储模拟器”设置为“False”(在 Azure 项目的属性中)。


听起来确实是一个奇怪的解决方案。那么存储仿真器没有启动吗? - BigChief
1
不可思议的是,这对我也起作用了。项目运行并且 WA 存储模拟器已经启动。多么奇怪啊。 - glosrob
4
这是否意味着即使您以前没有使用过存储仿真器(例如在计算机重新启动后),它也在运行?如果是的话,那么我可能遇到了同样的问题。我花了很长时间才发现问题所在。简单来说,“系统”进程(PID 4)正在侦听端口10,000,因此无法找到实际导致它的进程。但后来我发现存储仿真器已经在运行(只是一个没有任何UI的进程),所以我终止了它,然后就能够从Visual Studio启动Azure项目,它会启动存储仿真器。似乎它总是在计算机重新启动后运行。 - David Ferenczy Rogožan
1
顺便说一句,这并不是很奇怪。只是存储仿真器在系统启动时或某个时间点自动执行(可能),因此当您尝试从Visual Studio启动另一个仿真器时,它会失败。但仅限于存储仿真器(TCP端口10,000)。计算仿真器(端口10,001和10,002)未运行,因此必须从VS中执行。 - David Ferenczy Rogožan
1
这个怎么设置?@AChudov - Kitwradr

16
在文件C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe.config中,您需要更改端口号:

需要更改的截图


请将相关代码复制并粘贴到您的答案中,而不是链接到文本截图。 - BSMP

10

确保启动模拟器的用户与初始化模拟器的用户相同。请注意,如果您以不同的用户提升权限运行初始化,则该初始化仅适用于该用户。

如果这并没有帮助解决问题,您可以尝试使用 -inprocess 标志来启动模拟器,以获取更详细的错误消息:

WAStorageEmulator start -inprocess

1
嗯,也许这可能会导致一些问题,你能帮忙想出一个解决方案吗? 5/3/2014 4:05:28 PM [信息] 停止服务:Blob 服务状态:Blob http://127.0.0.1:10000/ False 由于另一个进程正在使用该文件,因此无法访问该文件。 错误:无法启动存储仿真器。 - BigChief
1
@BigChief 这可能意味着某个端口正在被使用。请运行接受答案中的命令。 - irwinb

10

以管理员身份运行Microsoft Azure命令提示符,尝试使用AzureStorageEmulator.exe init进行初始化,然后使用AzureStorageEmulator.exe start命令启动。对于我的情况,这种方法有效。


1
以管理员身份运行对我也起作用了。这很奇怪,因为在另一台电脑上,我不需要使用管理员权限。 - Greg Woods

9

我也曾遇到同样的问题。由于我的机器需要重新加入域并重新创建用户配置文件,因此出现了这个问题。 我注意到它是从提升的cmd选项-inprocess开始的。 然后我意识到这与urlac有关,我通过以下命令删除旧的urlac来解决了这个问题:

(from elevated cmd)
netsh http delete urlacl url=http://127.0.0.1:10000/
netsh http delete urlacl url=http://127.0.0.1:10001/
netsh http delete urlacl url=http://127.0.0.1:10002/

之后,只需像往常一样启动,工具将重新创建所需的内容。现在我可以在没有提升权限的情况下使用它。


8

值得一试的是使用管理员身份运行命令提示符,然后运行以下命令:C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe start

这对我很有用!


5
另一个选择是在存储仿真器目录中的配置文件中更改仿真器使用的IP绑定。请找到“wastorageemulator.exe.config”文件并进行更改。
<services>
      <service name="Blob" url="http://127.0.0.1:10000/"/>
      <service name="Queue" url="http://127.0.0.1:10001/"/>
      <service name="Table" url="http://127.0.0.1:10002/"/>
   </services>

如果另一个应用程序正在使用该端口,而您无法卸载它,则此方法将非常有用。


但这样做的后果是,您不能仅在ServiceConfiguration.Local.cscfg中使用配置设置Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString设置为UseDevelopmentStorage=true,而必须在那里放置完整的连接字符串(这非常庞大和复杂)。而且该配置文件是项目的一部分,因此每个开发人员都必须重新配置他的Azure模拟器。 - David Ferenczy Rogožan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接