Тайм-аут задержки с использованием 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.

введите описание изображения здесь

Другие вопросы по тегам