.NET MAUI注册页面MongoDB插入报错:名称服务器列表不能为空
.NET MAUI注册功能MongoDB连接报错:The list of configured name servers must not be empty.
问题详情
使用.NET MAUI开发学校项目时,点击注册按钮触发报错:
[DOTNET] Error during admin insertion: The list of configured name servers must not be empty. (Parameter 'servers')
已尝试连接本地MongoDB Compass和MongoDB Atlas,问题仍未解决,目标是实现注册账号存入MongoDB的功能。
相关代码
DBConnection类
public class DBConnection { private IMongoDatabase _database; public DBConnection() { try { var mongoClient = new MongoClient("mongodb+srv://<username>:<password>@cluster0.4jhaesp.mongodb.net/?retryWrites=true&w=majority"); _database = mongoClient.GetDatabase("homefinder"); Console.WriteLine("Connection to the database is successful."); } catch (MongoException ex) { Console.WriteLine($"Error during database connection: {ex.Message}"); throw; } catch (Exception ex) { Console.WriteLine($"Unexpected error during database connection: {ex}"); throw; } } public IMongoDatabase GetDatabase() { if (_database == null) { throw new InvalidOperationException("Database is not initialized. Make sure DBConnection constructor is called successfully."); } return _database; } }
SignupViewModel代码
public class Admins { [BsonId] public ObjectId Id { get; set; } public string Fullname { get; set; } public string Username { get; set; } public string PasswordHash { get; set; } public string Role { get;set; } } public class SignupViewModel : BindableObject { private string _fullname; private string _username; private string _password; private string _selectedRole; public string Fullname { get => _fullname; set { _fullname = value; OnPropertyChanged(nameof(Fullname)); } } public string Username { get => _username; set { _username = value; OnPropertyChanged(nameof(Username)); } } public string Password { get => _password; set { _password = value; OnPropertyChanged(nameof(Password)); } } public string SelectedRole { get => _selectedRole; set { _selectedRole = value; OnPropertyChanged(nameof(SelectedRole)); } } private async Task Signup(string password) { try { if (string.IsNullOrWhiteSpace(Fullname) || string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password)) { Console.WriteLine("Please fill in all required fields."); return; } var hashedPassword = BCrypt.Net.BCrypt.HashPassword(Password); var admin = new Admins { Fullname = Fullname, Username = Username, PasswordHash = hashedPassword, Role = SelectedRole }; await InsertAdminAsync(admin); await App.Current.MainPage.Navigation.PushAsync(new MainPage()); } catch (Exception ex) { Console.WriteLine($"Error during signup: {ex.Message}"); } } private async Task InsertAdminAsync(Admins admin) { try { var dbConnection = new DBConnection(); var database = dbConnection.GetDatabase(); var adminsCollection = database.GetCollection<Admins>("admins"); await adminsCollection.InsertOneAsync(admin); } catch (Exception ex) { Console.WriteLine($"Error during admin insertion: {ex.Message}"); } } public Command<string> SignupCommand => new Command<string>(async (password) => await Signup(password)); }
注册页面XAML代码
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:homefinderpro.ViewModels" x:Class="homefinderpro.Page.SignupPage" Title="SignupPage"> <StackLayout Background="#4F59DE" Padding="30"> <Label Text="SIGN UP" TextColor="White" FontFamily="Poppins-Bold" FontSize="30" HorizontalOptions="Center" /> <Frame BackgroundColor="White" Padding="20" CornerRadius="10"> <StackLayout> <Entry x:Name="FullnameEntry" Placeholder="Full Name" Text="{Binding Fullname}" /> <Entry x:Name="UsernameEntry" Placeholder="Username" Text="{Binding Username}" /> <Entry x:Name="PasswordEntry" Placeholder="Password" IsPassword="True" Text="{Binding Password}"/> <Picker x:Name="RolePicker" Title="Select Role" SelectedItem="{Binding SelectedRole, Mode=TwoWay}"/> <Button Text="SIGN UP" Background="Orange" TextColor="White" Command="{Binding SignupCommand}"/> </StackLayout> </Frame> <Button Text="Already have an account? Login" BackgroundColor="Orange" TextColor="White" Margin="0,20,0,0"/> </StackLayout> </ContentPage>
解决方案
1. 修正MongoDB连接字符串
- 替换连接字符串中的
<username>和<password>为MongoDB Atlas的真实账号密码,密码含特殊字符需做URL编码 - 本地MongoDB使用非
srv格式:mongodb://localhost:27017/homefinder - 从MongoDB Atlas官网Connect->Connect your application复制标准连接字符串,避免手动修改
2. 修复驱动依赖与兼容性
- 更新
MongoDB.Driver和MongoDB.Driver.CoreNuGet包至最新版 - 清理项目缓存后重新生成解决方案
3. 优化DBConnection单例模式
避免每次插入新建连接实例,改用单例减少开销:
public class DBConnection { private static IMongoDatabase _database; private static readonly object _lock = new object(); private DBConnection() { } public static IMongoDatabase GetDatabase() { if (_database == null) { lock (_lock) { if (_database == null) { try { var mongoClient = new MongoClient("mongodb+srv://your-username:your-password@cluster0.4jhaesp.mongodb.net/?retryWrites=true&w=majority"); _database = mongoClient.GetDatabase("homefinder"); Console.WriteLine("Connection to the database is successful."); } catch (MongoException ex) { Console.WriteLine($"Error during database connection: {ex.Message}"); throw; } } } } return _database; } }
4. 修复命令参数传递问题
按钮绑定未传参,修改XAML或命令定义:
- 方案1:给按钮添加参数绑定
<Button Text="SIGN UP" Background="Orange" TextColor="White" Command="{Binding SignupCommand}" CommandParameter="{Binding Password}"/>
- 方案2:改为无参命令(推荐,因ViewModel已有Password属性)
public Command SignupCommand => new Command(async () => await Signup()); private async Task Signup() { try { if (string.IsNullOrWhiteSpace(Fullname) || string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password)) { Console.WriteLine("请填写所有必填字段。"); return; } var hashedPassword = BCrypt.Net.BCrypt.HashPassword(Password); var admin = new Admins { Fullname = Fullname, Username = Username, PasswordHash = hashedPassword, Role = SelectedRole }; await InsertAdminAsync(admin); await App.Current.MainPage.Navigation.PushAsync(new MainPage()); } catch (Exception ex) { Console.WriteLine($"注册出错: {ex.Message}"); } }
5. 添加平台网络权限
- Android:在
AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- iOS:在
Info.plist中添加(允许HTTP请求)
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
内容的提问来源于stack exchange,提问作者ACGaming PH
相关产品推荐
相关产品推荐

