需要帮助连接到Android上的MongoDB集群

时间:2019-11-02 18:58:46

标签: c# android mongodb xamarin.forms

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

我将Visual Studio 2019与 MongoDB驱动程序版本2.9.2 android 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)

当我寻求解决此问题的方法时,我发现了这个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;
        }

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题。事实证明,Xamarin Android上的MongoDB驱动程序非常不支持 DNS种子列表连接格式 (从“ mongodb+srv://开始”)。因此,您必须使用 标准连接字符串格式 (从“ mongodb://开始”)。

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

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