点击Register无跳转且数据未写入数据库排查求助
注册功能故障求助
环境信息
- 开发环境:个人家庭实验室,VSCode编写代码(AI辅助)
- 代码托管:GitHub仓库
- CI/CD工具:Azure DevOps
- 部署平台:Azure Web Services(Web应用+SQL数据库)
故障现象
近几日数据库停止写入用户注册/登录数据,当前仅针对Register功能反馈问题:
- 视图加载正常、页面跳转正常
- 点击Register按钮后无跳转,用户提交的注册信息未存入数据库,上周该功能运行正常
排查情况
- Web应用日志流、浏览器开发者控制台均未发现错误
- 提交注册请求后返回200状态码,随后页面刷新,无法定位故障根源
- 已核查提交记录,未发现异常
- 开发者控制台显示POST请求状态为200,无任何错误或警告信息
相关代码
Account控制器
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using MyEcommerceBackend.Models; using SendGrid; using SendGrid.Helpers.Mail; namespace MyEcommerceBackend.Controllers { [Route("[controller]")] public class AccountController : Controller { private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager; private readonly IConfiguration _configuration; public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IConfiguration configuration) { _userManager = userManager; _signInManager = signInManager; _configuration = configuration; } [HttpPost("Register")] public async Task<IActionResult> Register(RegisterModel model) { if (ModelState.IsValid) { if (model.Email != null && model.Password != null) { var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, false); return RedirectToAction("RegisterSuccess", "View"); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } } else { ModelState.AddModelError("", "Email and Password must not be null"); } } return View("Register", model); }
注册模型(RegisterModel)
using System.ComponentModel.DataAnnotations; namespace MyEcommerceBackend.Models { public class RegisterModel // 用户注册模型 { [Required] [EmailAddress] public string? Email { get; set; } // 必填邮箱属性 [Required] [MinLength(6)] // 密码最小长度,可按需修改 public string? Password { get; set; } // 必填密码属性 [Compare("Password")] // 确保与密码字段匹配 public string? ConfirmPassword { get; set; } // 必填确认密码属性 } }
View控制器
using Microsoft.AspNetCore.Mvc; using MyEcommerceBackend.Models; public class ViewController : Controller // 处理用户视图(注册、登录等)的控制器 { [HttpGet] public IActionResult Register() { return View(); // 返回注册视图 } [HttpPost] public IActionResult Register(RegisterModel model) { return View(model); // 返回注册视图并携带模型数据 } public IActionResult RegisterSuccess() { return View(); // 返回注册成功视图 }
Program.cs
using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using MyEcommerceBackend.Models; namespace MyEcommerceBackend { public class Authentication { // 主方法 - 应用程序入口点 public static void Main(string[] args) { // 创建并运行Web主机 CreateHostBuilder(args).Build().Run(); } // 定义主机构建器 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { // 配置Web主机使用当前类(Authentication)作为启动类 webBuilder.UseStartup<Authentication>(); }); // 接受配置设置的构造函数 public Authentication(IConfiguration configuration) { Configuration = configuration; } // 配置属性 public IConfiguration Configuration { get; } // ConfigureServices方法 - 用于注册应用程序服务 public void ConfigureServices(IServiceCollection services) { // 从Azure读取环境变量 string server = Configuration["DBServer"] ?? throw new Exception("Server环境变量未设置。"); string database = Configuration["DB"] ?? throw new Exception("Database环境变量未设置。"); string username = Configuration["DBLogin"] ?? throw new Exception("Username环境变量未设置。"); string password = Configuration["DBPW"] ?? throw new Exception("Password环境变量未设置。"); // 构造连接字符串 string connectionString = $"Server=tcp:{server},1433;Initial Catalog={database};Persist Security Info=False;User ID={username};Password={password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; // 使用连接字符串添加DbContext services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString)); // 注册控制器服务 services.AddControllers(); // 添加MVC支持(包含视图和控制器) services.AddControllersWithViews(); // 添加身份验证和授权服务 services.AddIdentity<IdentityUser, IdentityRole>(options => { }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 配置API资源管理器和Swagger用于API文档 services.AddEndpointsApiExplorer(); services.AddSwaggerGen(); } // Configure方法 - 用于配置HTTP请求管道 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 在开发环境中启用Swagger if (env.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); // 启用Swagger UI以浏览API文档 } // 添加路由中间件 app.UseRouting(); // 添加身份验证和授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.UseStaticFiles(); // 提供静态文件(如CSS、JavaScript等) // 启用端点路由并配置默认路由 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=View}/{action=Login}/{id?}"); // 定义默认路由 endpoints.MapControllers(); }); } } }
注册视图(Register View)
<!DOCTYPE html> <html lang="en"> @{ ViewData["Title"] = "Please enter your Email and Password then click Register."; } <h2>@ViewData["Title"]</h2> <form method="post" asp-controller="Account" asp-action="Register"> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="email-label">Email:</span> </div> <input type="text" class="form-control" id="Email" name="Email" aria-describedby="email-label" required autocomplete="email"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="password-label">Password:</span> </div> <input type="password" class="form-control" id="Password" name="Password" aria-describedby="password-label" required autocomplete="new-password"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="confirm-password-label">Confirm Password:</span> </div> <input type="password" class="form-control" id="ConfirmPassword" name="ConfirmPassword" aria-describedby="confirm-password-label" required autocomplete="new-password"> </div> <button type="submit" class="btn btn-primary mb-3">Register</button> </form> </html>
复现步骤
- 打开Chrome浏览器访问网站
- 点击页面上的Register按钮
- 填写邮箱、密码及确认密码字段
- 点击Register提交按钮
预期与实际结果
- 预期结果:页面跳转至注册成功页面,用户信息存入SQL数据库
- 实际结果:页面刷新,无跳转动作,用户数据未写入数据库
内容的提问来源于stack exchange,提问作者Jonathan Howard
相关产品推荐
相关产品推荐

