c# - 需要帮助连接到 Android 上的 MongoDB 集群
问题描述
我正在使用 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)
当我在寻找这个问题的解决方案时,我发现了这个错误报告,指出“ 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;
}
解决方案
我也遇到了这个问题。事实证明,Xamarin Android 上的 MongoDB Driver 并不能很好地支持DNS Seedlist Connection Format(从“ mongodb+srv://
”开始)。所以你必须使用标准连接字符串格式(从“ mongodb://
”开始)。
请转到 Atlas 并通过选择旧版本驱动程序(如 C#/.NET 2.4)找到您的标准连接字符串
有关这两种连接方式的更多说明,请参阅此
推荐阅读
- c - C 中的头文件的目的是只警告用户吗?
- pandas - pandas simpleimputer 保留数据类型
- python - 将列表转储到 csv 导出
- xcode - 有没有办法默默地接受 xcode 许可证?
- office365 - Office 365 应用程序与本地 SQL Server 数据库的连接
- three.js - 在着色器中移动顶点后计算边界框
- json - Angular 7 http.post JSON 数字作为字符串发送
- java - 如何跟踪两个或多个键的按下?
- swift4 - 如何获取字符串中不同字符的#?(斯威夫特 4.2 + )
- html - 尝试在 div 中将 4 个图表 JS 图表居中时遇到问题