从其他设备访问Azure模拟器
我有两个不同的项目:
- Windows Phone 8应用程序,我在一个真实的物理开发设备上运行。
- Azure云服务,包含一个包含ASP.NET MVC WebAPI的简单WebRole端点。
我的目标很简单:
使用从真实设备运行的WP8应用程序,在将WebAPI控制器部署到Azure仿真器时访问(使用HTTPClient)。
做的是:
- 在Azure云上部署应用程序时,该应用程序可以成功与WebApi进行通信。
- 当应用程序在
IIS Express
(无Azure)上本地托管时,应用程序可以成功与WebApi进行通信,并且在本文后面会更改IIS Express
设置。
据我所知,问题是Azure模拟器配置为侦听IP地址127.0.0.1,该地址无法从localhost域外部访问。
我发现这篇文章提供了这个确切问题的解决方案,但是在尝试部署到Azure模拟器时尝试遵循它会导致未知exception。
是否真的无法在本地测试与Azure Cloud Service通信的WP8应用程序?
我想出了如何使用手机模拟器或连接的物理Windows Phone设备与Azure模拟器进行通信。
对于其他正在努力满足相同要求的开发人员,以下是其工作所需的步骤:
假设:
- 您知道主机的IP地址。
- 没有防火墙阻止访问
- 关闭IIS和Azure仿真器并在配置更改后重新启动它们
Azure计算模拟器:
- 打开
"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\devfabric\DevFC.exe.config"
进行编辑。 - 将
"VipPoolStartIPAddress"
和"VipPoolEndIPAddress"
为您的主机IP(例如192.168.1.100)
Azure存储模拟器:
- 打开
"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\devstore\DSServiceLDB.exe.config"
和"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\devstore\DSServiceSQL.exe.config"
编辑。 - 在两个文件中设置
services
部分以使用托管IP。 - 在“角色”设置中配置存储连接字符串(而不是默认的
Windows Azure storage emulator
设置):- 右键单击
Role
(在解决方案资源管理器中的“Roles”文件夹下),进入其Properties
页面。 单击“Settings
选项卡。 确保编辑“Local
设置(在“Service Configuration
选择框中选择它)。 - 编辑存储的连接字符串
- 手动输入凭据
- 帐户名和帐户密钥写在
DSServiceSQL.exe.config
accounts
部分下 - 使用您的托管IP指定自定义端点。
- 右键单击
请享用!
您不需要任何外部应用程序来执行此操作。 使用以下命令尝试端口转发:
-
在Azure模拟器中运行您的应用程序,然后通过右键单击系统托盘中的IIS Express图标(例如127.0.0.1:81)找出其IP和端口
-
现在选择一个要监听的端口(例如8088)并通过在提升的命令提示符中执行以下命令将其传入的请求转发到您的应用程序:
netsh interface portproxy add v4tov4 listenport=8088 connectaddress=127.0.0.1 connectport=81 protocol=tcp
-
如果防火墙正在运行且您选择的端口被阻止,则通过向Windows防火墙添加入站规则来打开端口(本例中为8088)。
现在使用您的计算机IP浏览,如192.168.0.100:8088,现在您应该能够访问您的应用程序。 这可以通过您的WP或Cordova(移动)应用程序在本地进行测试。 希望这可以帮助。
(如果要删除端口转发,则只需使用netsh interface portproxy命令的delete开关。)
由于您已经使用(常规) IIS
并声称它可以正常工作,因此您可以将Server Farming
用作某种Reverse Proxy
+ Load Balancer
来实现您的目标:
-
运行WebRole项目并保存内部URL(如图
127.255.0.2:82
)。 -
打开
IIS Manager
>Server Farms
>Create Server Farm
。 -
选择一个名称,然后单击
Next
在下一个面板(“添加服务器”)中添加您在步骤1和Finish
收集的所有URL。 -
当系统询问您是否要为此服务器场创建相应的“
Rewrite Rules
Yes
时,单击“Yes
Rewrite Rules
。 -
在“
Server Farms
列表下,单击新场,然后从右侧的图标中选择“Proxy
”,选中“Reverse rewrite host in response headers
复选框。 -
您现在可以使用常规IIS绑定地址来访问
Emulator
实例(一旦运行)。
PS:如果要撤消此更改,请删除Farm。 然后单击左侧树中的计算机/服务器名称(根项目),选择右侧的Url Rewrite
,并删除ARR
规则。
我知道这已经得到了解答,但是尚未找到解决此问题的简单解决方案。 以下是我让我的Mac与我的局域网上运行的我的Azure存储模拟器(v4.3)进行通信所做的工作。
在撰写本文时,我正在使用Azure存储模拟器的v4.3运行Windows 10版本1511。
- 确保Azure存储模拟器已关闭。 您可以通过打开Azure存储模拟器命令提示符来执行此操作。 您可以通过在“开始”菜单中键入
Azure Storage Emulator
来找到它。 打开后,键入AzureStorageEmulator stop
。 - 获取运行Azure存储模拟器的计算机的IP地址。 在已打开的命令提示符下键入
ipconfig
。 找到IPV4地址 – 应该像192.168.1.xxx
- 打开位于
C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe.config
- 在
StorageEmulatorConfig
部分中,编辑每个服务,使其如下所示。 显然用您的实际IP地址替换“xxx.xxx.xxx.xxx”…但保持端口相同! - 接下来,转到防火墙设置。 我们需要允许将计算机IP地址的入站连接到
StorageEmulatorConfig
部分中列出的三个端口。 在控制面板 – >系统和安全 – > Windows防火墙 – >高级设置 – >入站规则下,单击屏幕右侧的New Rule...
您将通过向导运行以设置新规则。 我将概述下面要做的事情:
规则类型 :选择
Custom
程序 :选择
Customize...
然后Apply to services only
协议和端口 :将
Protocol type
设置为TCP
并将Remote port
设置为Specific Ports
然后在输入框中输入10000-10002
。 这会将StorageEmulatorConfig
部分中指定的端口范围添加到此规则,并允许通过这些端口的传入连接。范围 :跳过此部分,为简单起见,它适用于所有IP地址
操作 :允许连接
配置文件 :根据您运行的连接配置文件,您应该选择适当的配置文件。 在我的情况下,我的计算机连接到我家的局域网,所以我连接到一个专用网络。 我取消选择
Domain
和Public
。 我建议做同样的事情。名称 :Azure存储模拟器
点击结束,你就完成了…… ……那部分……
-
打开管理员提升的命令提示符并输入以下命令(注意:将xxx.xxx.xxx.xxx替换为您的IP地址!!!):
netsh http add urlacl url=http://xxx.xxx.xxx.xxx:10000/ user=everyone
netsh http add urlacl url=http://xxx.xxx.xxx.xxx:10001/ user=everyone
netsh http add urlacl url=http://xxx.xxx.xxx.xxx:10002/ user=everyone
-
在您尝试连接到Azure存储模拟器的设备上打开浏览器,并尝试访问以下URL:
http://xxx.xxx.xxx.xxx:10002/
http://xxx.xxx.xxx.xxx:10002/
http://xxx.xxx.xxx.xxx:10002/
如果你收到回复,那就是这样的:
InvalidUri请求的URI不代表服务器上的任何资源。
然后你就是金色……如果没有,发表评论我会更新我的回复。
重要的是要注意,您必须更新项目的.config文件中的连接字符串,您要在其中生成访问图像的URL(假设您正在执行的操作)。 您可能不会使用更快的开发连接! 必须更新为:(将xxx.xxx.xxx.xxx替换为上面的IP地址:
DefaultEndpointsProtocol = http; AccountName = devstoreaccount1; AccountKey = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq / K1SZFPTOtr / KBHBeksoGMGw ==; BlobEndpoint = http://xxx.xxx.xxx.xxx:10000/devstoreaccount1;TableEndpoint=http://xxx.xxx.xxx.xxx: 10002 / devstoreaccount1; QueueEndpoint = http://xxx.xxx.xxx.xxx:10001 / devstoreaccount1 ;
如果您在AppSettings部分中有这个并且使用\ n进行了很好的格式化,那么您将破坏该字符串,并且存储组件将不会将其识别为有效的连接字符串。 所以保持一个长的恼人的字符串。
我找到了一种方法,感谢这篇伟大的post 。
显然,通过将发送到我本地IP地址(例如192.168.0.1)的任何流量重新路由到127.0.0.1,我现在可以使用Windows Phone 8 Emulator来对抗Azure Cloud Emulator实例。
我做路由的方式是使用一个名为PassPort的简单应用程序,但我认为它有很多替代方案。
由于Azure模拟器的不稳定性,建议使用端口转发。 但是,当使用我的Windows 7上的内置工具netsh
, connectaddress是127.0.0.1时,它不起作用(详情请参阅: 使用netsh添加portproxy的问题 )。 我搜索并找到PassPort端口转发实用程序Win XP来帮助我进行端口转发。