使用来自 Android Xamarin 的 CosmosDB 的延迟超时

Latency timeout using CosmosDB from Android Xamarin

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

我们还在 Microsoft Azure 上使用 CosmosDB。

试图让 Android 访问 CosmosDB 时出现问题。请注意,我正在为 Cosmos 使用 Mongo API。

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

A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode : Primary } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "2", ConnectionMode : "ReplicaSet", Type : "ReplicaSet", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 2, EndPoint : "Unspecified/aspire-cosmosdb.documents.azure.com:10255" }", EndPoint: "Unspecified/aspire-cosmosdb.documents.azure.com:10255", State: "Disconnected", Type: "Unknown" }] }.

这是我的代码:

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 秒超时。我还在 Android 上启用了 Internet 权限,但没有任何乐趣。请帮忙!

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

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

好吧,经过大量的敲打之后,解决方案相当简单。

CosmosDB 仅支持 TLS 1.2。

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

我的设置为 'default'。我猜 'default' 在撰写本文时不支持 TLS 1.2。无论如何,至少不在 Xamarin 上用于 Mac。这是一个陷阱。将它切换到 Native TLS 1.2+,神奇地它就可以正常工作了!现在可以通过 Android.

连接到 CosmosDB