Тайм-аут задержки с использованием CosmosDB от Android Xamarin
Я разрабатываю приложение с использованием Xamarin с использованием Visual Studio для Mac. Я пишу C# для целевой iOS и Android.
Мы также используем CosmosDB в Microsoft Azure.
Проблема возникает при попытке получить Android для доступа к CosmosDB. Обратите внимание, что я использую Mongo API для Cosmos.
Сообщение об ошибке, которое я получаю в Android, выглядит следующим образом:
Тайм-аут произошел после 30000 мс при выборе сервера с помощью CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode: Primary } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Клиентское представление состояния кластера: { ClusterId: "2", ConnectionMode: "ReplicaSet", тип: "ReplicaSet", состояние: "Disconnected", серверы: [{ ServerId: "{ ClusterId: 2, EndPoint: "Unspecified/aspire-cosmosdb.documents.azure.com:10255" }", EndPoint: "Unspecified/aspire-cosmosdb.documents.azure.com:10255", состояние: "Disconnected", тип: "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. Подключается каждый раз. Код в значительной степени копируется и вставляется с быстрого запуска CosmosDB на портале Azure. Я также взял этот код и поместил его в консольное приложение C#, и он также работает. Однако тот же код не работает на Android. Зачем?
Я пробовал это как на симуляторе Android, так и на реальном устройстве Android, и оба раза получал этот 30-секундный тайм-аут. Я также включил интернет-разрешение на Android, но не радости. Пожалуйста помоги!
Я ссылался на последние пакеты через Nuget на момент написания:
- MongoDB.Driver -2.4.4
- MongoDB.Driver.Core - 2.4.4
- MongoDB.Bson - 2.4.4
Примечание: я скрыл личные данные от DSN, но он должен показать вам приблизительный формат. Фактический dsn - это прямое копирование и вставка строки подключения cosmosdb dsn с портала Azure.
1 ответ
Хорошо, так что после МНОГО удара головой решение довольно простое.
CosmosDB поддерживает только TLS 1.2.
Зайдите в настройки вашего проекта Droid (щелкните правой кнопкой мыши на проекте> Параметры) и перейдите в Android Build > Реализация SSL/TLS.
Мой был установлен на "по умолчанию". Я предполагаю, что "default" на момент написания статьи не поддерживает TLS 1.2. По крайней мере, не на Xamarin для Mac в любом случае. Это довольно хорошо. Переключите его на Native TLS 1.2+ и волшебным образом он просто работает! Теперь можно подключиться к CosmosDB через Android.