【问题标题】:Need help connecting to MongoDB cluster on Android需要帮助连接到 Android 上的 MongoDB 集群
【发布时间】:2019-11-02 18:58:46
【问题描述】:

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

我正在使用带有 MongoDB 驱动程序版本 2.9.2android 28 作为目标 SDK 版本的 Visual Studio 2019。

我在 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)

当我在寻找这个问题的解决方案时,我发现了这个bug report, 声明“Android 目前不是 .NET 驱动程序支持的平台

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

编辑:我还找到了this possible solution。提供答案的用户表示“从 Android 8 (Oreo) 开始,对 net.dns 的访问权限已被删除”。事实上,当我从我的 AndroidManifest.xml 中删除 android:targetSdkVersion="28" 时,程序不再崩溃,但是一旦我想将应用程序上传到 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# android mongodb xamarin.forms


【解决方案1】:

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

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

关于这两种连接方式的更多说明,请参考this

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多