首页 > 解决方案 > 需要帮助连接到 Android 上的 MongoDB 集群

问题描述

我正在使用 Xamarin Forms 开发移动应用程序,并打算使用 Mongo 数据库。

我使用 Visual Studio 2019 和MongoDB 驱动程序版本 2.9.2android 28作为目标 SDK 版本。

我在 MongoDB Atlas 上创建了一个集群,暂时将所有 IP 地址列入白名单,并尝试使用为集群提供的连接字符串将应用程序连接到集群(在下面的代码中,我用占位符替换了真实的用户名和密码)。

这是代码:

private const string CONNECTION_STRING = "mongodb+srv://username:password@cluster0-uswax.mongodb.net/test?retryWrites=true&w=majority";

var client = new MongoClient(CONNECTION_STRING);

如果我使用 Android 模拟器运行程序,则创建 MongoClient 的行是程序崩溃的地方,但出现以下异常:

System.AggregateException
  Message=Error resolving name servers (Value cannot be null.
Parameter name: source) (Could not find file "/etc/resolv.conf")
  Source=DnsClient
  StackTrace:
  at DnsClient.NameServer.ResolveNameServers (System.Boolean skipIPv6SiteLocal, System.Boolean fallbackToGooglePublicDns) [0x0005e] in <93b57b4b99c64a96a2c065ea9ae1fc1f>:0 
  at DnsClient.LookupClient..ctor () [0x00000] in <93b57b4b99c64a96a2c065ea9ae1fc1f>:0 
  at MongoDB.Driver.Core.Configuration.ConnectionString.Resolve (System.Boolean resolveHosts) [0x00011] in <bfbe70fcd6734952960e694cb03fd3c6>:0 
  at MongoDB.Driver.MongoUrl.Resolve (System.Boolean resolveHosts) [0x00015] in <f2c302ca191a4adf889da299a582e348>:0 
  at MongoDB.Driver.MongoClientSettings.FromUrl (MongoDB.Driver.MongoUrl url) [0x0001b] in <f2c302ca191a4adf889da299a582e348>:0 
  at MongoDB.Driver.MongoClientSettings.FromConnectionString (System.String connectionString) [0x00006] in <f2c302ca191a4adf889da299a582e348>:0 
  at MongoDB.Driver.MongoClient..ctor (System.String connectionString) [0x00000] in <f2c302ca191a4adf889da299a582e348>:0 
  at Socializer.Helpers.MongoCrud..ctor (System.String connectionString, System.String databaseName) [0x00008] in D:\Data\projects\xamarin\Socializer\Socializer\Socializer\Helpers\MongoCrud.cs:18 
  at Socializer.App..ctor () [0x0001b] in D:\Data\projects\xamarin\Socializer\Socializer\Socializer\App.xaml.cs:27 
  at Socializer.Droid.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x0002f] in D:\Data\projects\xamarin\Socializer\Socializer\Socializer.Android\MainActivity.cs:24 
  at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x00011] in <11a340ccc8de43f09c97400139266ef5>:0 
  at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.8(intptr,intptr,intptr)

当我在寻找这个问题的解决方案时,我发现了这个错误报告,指出“ Android 目前不是 .NET 驱动程序支持的平台

这是否意味着我不能将 MongoDB 用于 Android 应用程序,或者还有其他方法吗?谢谢!

编辑:我也找到了这个可能的解决方案。提供答案的用户表示“从 Android 8 (Oreo) 开始,对 net.dns 的访问已被删除”。事实上,当我android:targetSdkVersion="28"从我的 AndroidManifest.xml 中删除时,程序不再崩溃,但是一旦我想将应用程序上传到 Play 商店,这将不是一个选项。上面的解决方案是基于自定义实现来获取 DNS 服务器,但我不知道如何在我的代码中实现这个功能。如果有人可以帮助我,我将不胜感激。

这是功能:

public List<IPEndPoint> GetDnsServers()
        {
            var context = Android.App.Application.Context;
            List<IPEndPoint> endPoints = new List<IPEndPoint>();
            ConnectivityManager connectivityManager =
        (ConnectivityManager)context.GetSystemService(MainActivity.ConnectivityService);

            Network activeConnection = connectivityManager.ActiveNetwork;
            var linkProperties = connectivityManager.GetLinkProperties(activeConnection);

            foreach (InetAddress currentAddress in linkProperties.DnsServers)
            {
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(currentAddress.HostAddress), 53);
                endPoints.Add(endPoint);
            }
            return endPoints;
        }

标签: c#androidmongodbxamarin.forms

解决方案


我也遇到了这个问题。事实证明,Xamarin Android 上的 MongoDB Driver 并不能很好地支持DNS Seedlist Connection Format(从“ mongodb+srv://”开始)。所以你必须使用标准连接字符串格式(从“ mongodb://”开始)。

请转到 Atlas 并通过选择旧版本驱动程序(如 C#/.NET 2.4)找到您的标准连接字符串

有关这两种连接方式的更多说明,请参阅


推荐阅读