1

我正在使用 Visual Studio for Mac 开发一个使用 Xamarin 的应用程序。我正在编写 C# 以同时针对 iOS 和 Android。

我们还在 Microsoft Azure 上使用 CosmosDB。

尝试让 Android 访问 CosmosDB 时出现问题。请注意,我使用的是用于 Cosmos 的 Mongo API。

我在Android中得到的错误信息如下:

使用 CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode : Primary } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } } 选择服务器 30000 毫秒后发生超时。集群状态的客户端视图是 { ClusterId : "2", ConnectionMode : "ReplicaSet", Type : "ReplicaSet", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 2, EndPoint : "Unspecified/aspire- cosmosdb.documents.azure.com:10255" }",端点:“未指定/aspire-cosmosdb.documents.azure.com:10255”,状态:“断开连接”,类型:“未知”}] }。

这是我的代码:

using System;
using System.Diagnostics;
using System.Threading.Tasks;
using MongoDB.Driver;

string dsn = "mongodb://myusername:mypassword@mycosmosname.documents.azure.com:10255/?ssl=true&replicaSet=globaldb";
string databaseName = "mydatabasename";

Debug.WriteLine("Initializing Cosmos DB!");
MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(dsn));
settings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
var mongoClient = new MongoClient(settings);
var db = mongoClient.GetDatabase(databaseName);

var databases = (await mongoClient.ListDatabasesAsync()).ToList();
foreach (var d in databases)
{
    Debug.WriteLine(d.AsBsonDocument);
}

这在 xamarin.ios 上可以 100% 正常工作。每次都连接。该代码几乎是从 Azure 门户上的 CosmosDB 快速入门复制和粘贴的。我还采用了此代码并将其放入 C# 控制台应用程序中,它也可以工作。但是,相同的代码在 Android 上不起作用。为什么?

我在 Android 模拟器和真正的 Android 设备上都试过这个,两次都得到这个 30 秒的超时。我也在安卓上启用了互联网权限,但没有任何乐趣。请帮忙!

在撰写本文时,我已经通过 Nuget 引用了最新的软件包:

  • MongoDB.Driver -2.4.4
  • MongoDB.Driver.Core - 2.4.4
  • MongoDB.Bson - 2.4.4

注意:我已经混淆了 dsn 中的个人详细信息,但它应该向您显示它的粗略格式。实际的 dsn 是来自 Azure 门户的 cosmosdb dsn 连接字符串的直接复制和粘贴。

4

1 回答 1

1

好的,经过大量的头撞后,解决方案相当简单。

CosmosDB 仅支持 TLS 1.2。

进入您的 Droid 项目设置(右键单击项目 > 选项)并转到 Android 构建 > SSL/TLS 实施。

我的设置为“默认”。我猜在撰写本文时“默认”不支持 TLS 1.2。至少在 Xamarin for Mac 上没有。这真是个难题。将其切换到 Native TLS 1.2+,神奇地它就可以工作了!现在可以通过 Android 连接到 CosmosDB。

在此处输入图像描述

于 2017-12-20T09:30:20.160 回答