如何启用iOS模拟器连接到CosmosDB模拟器

时间:2018-11-11 05:39:24

标签: azure-cosmosdb

我正在开发一个应用程序,我想使我的iOS模拟器和开发设备能够连接到在Windows笔记本电脑上运行的CosmosDB模拟器。

我可以设置正确的终结点URL,指向仿真器,但是当我通过IP访问SSL时,对SSL的信任失败,并且Azure CosmosDB证书具有一组固定的主题备用名称:

- DNS Name = localhost
- DNS Name = <my windows hostname>
- IP Address = 127.0.0.1
- IP Address = 172.18.222.81
- DNS Name = 127.0.0.1
- DNS Name = 172.18.222.81

现在,对于模拟器,我想我可以使用hosts文件解决它,只需映射到我的Windows IP。或使用Charles Proxy及其DNS欺骗,但这在我的开发设备上无法正常工作。我无法更改主机文件,Charles Proxy将使用该应用程序中的DNS欺骗来代理来自Safari的Web请求,但DocumentClient中的Microsoft.Azure.Documents.Client似乎根本没有使用该代理。

使用https://<my windows hostname>:8081作为端点URL时,从设备尝试时出现名称解析错误。

  

System.Net.Http.HttpRequestException:发送请求时发生错误---> System.Net.WebException:错误:NameResolutionFailure

但是,我可以设置自己的HttpClient并从提供的HttpClientHandler启用Proxy,并且确实可以在没有名称解析错误的情况下从以下位置的仿真器中提取html:https://<my windows hostname>:8081/_explorer/index.html

这两个都将成功使用代理并获取html:

var settings = CoreFoundation.CFNetwork.GetSystemProxySettings();
var address = $"{settings.HTTPProxy}:{settings.HTTPPort}";
HttpClientHandler proxyHandler = new HttpClientHandler()
{
    Proxy = new WebProxy(Address: address, BypassOnLocal: false)
    UseProxy = true,
}

httpClient = new HttpClient(proxyHandler);

还有这个

HttpClientHandler proxyHandler = new HttpClientHandler()
{
    Proxy = CoreFoundation.CFNetwork.GetDefaultProxy(),
    UseProxy = true,
}

httpClient = new HttpClient(proxyHandler);

所以我知道它可以工作,DocumentClient中的Microsoft.Azure.Documents.Client似乎不会使用任何代理,除非找不到任何东西,否则我无法找到一种方法来配置它使用一个代理。 / p>

1 个答案:

答案 0 :(得分:0)

这是一个有趣的场景,尚未通过测试或调查是否可行。尽管您可以启动仿真器,例如它允许从任何IP访问:

CosmosDB.Emulator.exe -AllowNetworkAccess -NoFirewall -Key=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw== 

第二步是导出证书,您必须将该证书导入另一台计算机(对于您的IOS Simulator)。我发现有一篇文章可能会有所帮助: Adding a self-signed certificate to iphone Simulator?

要导出证书,请执行以下PowerShell命令行:

New-Variable HostDirectory -Scope Global -Option Constant -Value ((Get-Item $PSScriptRoot).CreateSubdirectory('bind-mount'))
New-Variable Key -Scope Global -Option Constant -Value 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='
$password = ConvertTo-SecureString -String $Key -Force -AsPlainText
$cert = Get-ChildItem cert:\LocalMachine\My | Where-Object { $_.FriendlyName -eq "DocumentDbEmulatorCertificate" }
Export-PfxCertificate -Cert $cert -FilePath "$HostDirectory\CosmosDbEmulatorCert.pfx" -Password $password | Out-Null

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import("$HostDirectory\CosmosDbEmulatorCert.pfx", $Key, "DefaultKeySet")
$cert | Export-Certificate -FilePath "$HostDirectory\CosmosDbEmulatorCert.cer" -Type CERT

假设您可以将该证书导入iOS,那么您的IP就是运行模拟器的计算机的IP。

如果证明无法导入证书,则我们正在为下一个.NET SDK版本进行改进,该版本将允许您配置我们在幕后使用的HTTPClient,因此您可以配置诸如禁用SSL验证(您永远不应该为生产而做,但是对于仅用于开发目的会有所帮助。