【发布时间】:2021-03-02 14:57:09
【问题描述】:
通过邮递员从我的 API 到我的数据库的发布请求给了我这样的响应: { "message": "无效的对象名称 'Accounts'。" }
这些是我的 C# 代码,我不知道我做错了什么或缺少什么。请帮忙。
-
AccountsController.
使用自动映射器; 使用 Microsoft.AspNetCore.Http; 使用 Microsoft.AspNetCore.Mvc; 使用系统; 使用 System.Collections.Generic; 使用Africanbiomedtests.Entities; 使用 Africabiomedtests.Models.Accounts; 使用 Africabiomedtests.Services;
namespace Africanbiomedtests.Controllers { [ApiController] [Route("[controller]")] public class AccountsController : BaseController { private readonly IAccountService _accountService; private readonly IMapper _mapper; public AccountsController( IAccountService accountService, IMapper mapper) { _accountService = accountService; _mapper = mapper; } [HttpPost("authenticate")] public ActionResult<AuthenticateResponse> Authenticate(AuthenticateRequest model) { var response = _accountService.Authenticate(model, ipAddress()); setTokenCookie(response.RefreshToken); return Ok(response); } [HttpPost("refresh-token")] public ActionResult<AuthenticateResponse> RefreshToken() { var refreshToken = Request.Cookies["refreshToken"]; var response = _accountService.RefreshToken(refreshToken, ipAddress()); setTokenCookie(response.RefreshToken); return Ok(response); } [Authorize] [HttpPost("revoke-token")] public IActionResult RevokeToken(RevokeTokenRequest model) { // accept token from request body or cookie var token = model.Token ?? Request.Cookies["refreshToken"]; if (string.IsNullOrEmpty(token)) return BadRequest(new { message = "Token is required" }); // users can revoke their own tokens and admins can revoke any tokens if (!Account.OwnsToken(token) && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); _accountService.RevokeToken(token, ipAddress()); return Ok(new { message = "Token revoked" }); } [HttpPost("register")] public IActionResult Register(RegisterRequest model) { _accountService.Register(model, Request.Headers["origin"]); return Ok(new { message = "Registration successful, please check your email for verification instructions" }); } [HttpPost("verify-email")] public IActionResult VerifyEmail(VerifyEmailRequest model) { _accountService.VerifyEmail(model.Token); return Ok(new { message = "Verification successful, you can now login" }); } [HttpPost("forgot-password")] public IActionResult ForgotPassword(ForgotPasswordRequest model) { _accountService.ForgotPassword(model, Request.Headers["origin"]); return Ok(new { message = "Please check your email for password reset instructions" }); } [HttpPost("validate-reset-token")] public IActionResult ValidateResetToken(ValidateResetTokenRequest model) { _accountService.ValidateResetToken(model); return Ok(new { message = "Token is valid" }); } [HttpPost("reset-password")] public IActionResult ResetPassword(ResetPasswordRequest model) { _accountService.ResetPassword(model); return Ok(new { message = "Password reset successful, you can now login" }); } [Authorize(Role.Admin)] [HttpGet] public ActionResult<IEnumerable<AccountResponse>> GetAll() { var accounts = _accountService.GetAll(); return Ok(accounts); } [Authorize] [HttpGet("{id:int}")] public ActionResult<AccountResponse> GetById(int id) { // users can get their own account and admins can get any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); var account = _accountService.GetById(id); return Ok(account); } [Authorize(Role.Admin)] [HttpPost] public ActionResult<AccountResponse> Create(CreateRequest model) { var account = _accountService.Create(model); return Ok(account); } [Authorize] [HttpPut("{id:int}")] public ActionResult<AccountResponse> Update(int id, UpdateRequest model) { // users can update their own account and admins can update any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); // only admins can update role if (Account.Role != Role.Admin) model.Role = null; var account = _accountService.Update(id, model); return Ok(account); } [Authorize] [HttpDelete("{id:int}")] public IActionResult Delete(int id) { // users can delete their own account and admins can delete any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); _accountService.Delete(id); return Ok(new { message = "Account deleted successfully" }); } // helper methods private void setTokenCookie(string token) { var cookieOptions = new CookieOptions { HttpOnly = true, Expires = DateTime.UtcNow.AddDays(7) }; Response.Cookies.Append("refreshToken", token, cookieOptions); } private string ipAddress() { if (Request.Headers.ContainsKey("X-Forwarded-For")) return Request.Headers["X-Forwarded-For"]; else return HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } } }
2)。帐户实体
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Africanbiomedtests.Entities
{
public class Account
{
public int Id { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
public bool AcceptTerms { get; set; }
public Role Role { get; set; }
public HealthcareProvider HealthcareProvider { get; set; }
public string VerificationToken { get; set; }
public DateTime? Verified { get; set; }
public bool IsVerified => Verified.HasValue || PasswordReset.HasValue;
public string ResetToken { get; set; }
public DateTime? ResetTokenExpires { get; set; }
public DateTime? PasswordReset { get; set; }
public DateTime Created { get; set; }
public DateTime? Updated { get; set; }
public List<RefreshToken> RefreshTokens { get; set; }
public bool OwnsToken(string token)
{
return this.RefreshTokens?.Find(x => x.Token == token) != null;
}
}
}
3)。注册请求模型
using System.ComponentModel.DataAnnotations;
namespace Africanbiomedtests.Models.Accounts
{
public class RegisterRequest
{
[Required]
public string Title { get; set; }
[Required]
[StringLength(30)]
[RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
public string FirstName { get; set; }
[Required]
[StringLength(30)]
[RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
public string LastName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[MinLength(6)]
public string Password { get; set; }
[Required]
[Compare("Password")]
public string ConfirmPassword { get; set; }
[Range(typeof(bool), "true", "true")]
public bool AcceptTerms { get; set; }
}
}
【问题讨论】:
-
请提供minimal reproducible example,因为您提供的代码似乎超出了演示问题的要求。还请说明您是如何调用 API 的。
-
您是否尝试过先在控制器方法的第一行设置断点,然后逐行逐行查找问题的根源?
标签: c# api postman asp.net-core-3.1