我正在开发一个简单的测试 Web 应用程序,具有注册和登录功能。我尝试使用此 POST 请求通过 Postman 向数据库添加新行:
https://localhost:7239/api/Auth/Register
但我收到此错误:
System.InvalidOperationException:尝试激活“WebApplication1.Controllers.AuthController”时无法解析类型“WebApplication1.Data.AppDbContext”的服务。
at lambda_method13(Closure, IServiceProvider, Object[])
at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
数据库已启动并正在运行。
这是我的
AuthController.cs
:
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WebApplication1.Data;
using WebApplication1.Models;
using System.Threading.Tasks;
namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly AppDbContext _context;
public AuthController(AppDbContext context)
{
_context = context;
}
[HttpPost("register")]
public async Task<IActionResult> Register(User user)
{
if (ModelState.IsValid)
{
_context.Users.Add(user);
await _context.SaveChangesAsync();
return Ok("User registered successfully.");
}
return BadRequest("Invalid model state.");
}
[HttpPost("login")]
public async Task<IActionResult> Login(User user)
{
var existingUser = await _context.Users.FirstOrDefaultAsync(u => u.Username == user.Username && u.Password == user.Password);
if (existingUser != null)
{
return Ok("Login successful.");
}
return BadRequest("Invalid username or password.");
}
}
}
AppDbContext.cs
:
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
public DbSet<User> Users { get; set; }
}
}
Startup.cs
的一部分:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
services.AddControllers();
}
appsettings.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=database;Username=postgres;Password=qwertyps4;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
最后是模型
User.cs
:
using System.ComponentModel.DataAnnotations;
namespace WebApplication1.Models
{
public class User
{
public int Id { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string Password { get; set; }
}
}
我已经检查了所有文件好几次了,但就是无法找出问题所在。
将您的 AppContext.cs 修改为此并添加无参数构造函数。
public class AppDbContext : DbContext
{
// Constructor with DbContextOptions
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
// Parameterless constructor
public AppDbContext()
{
}
public DbSet<User> Users { get; set; }
}