我正在使用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;
}
答案 0 :(得分:0)
我也遇到了这个问题。事实证明,Xamarin Android上的MongoDB驱动程序非常不支持 DNS种子列表连接格式 (从“ mongodb+srv://
开始”)。因此,您必须使用 标准连接字符串格式 (从“ mongodb://
开始”)。
请转到Atlas并通过选择旧版本的驱动程序(例如C#/。NET 2.4)来找到您的标准连接字符串
有关这两种连接方式的更多说明,请参见this