【问题标题】:.Netcore Api Postman 500 Internal Server Error.Net Core Api Postman 500 内部服务器错误
【发布时间】:2021-03-02 14:57:09
【问题描述】:

通过邮递员从我的 API 到我的数据库的发布请求给了我这样的响应: { "message": "无效的对象名称 'Accounts'。" }

这些是我的 C# 代码,我不知道我做错了什么或缺少什么。请帮忙。

  1. 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


【解决方案1】:

感谢约翰的帮助,我意识到我还没有完成我的 EF 数据库迁移,所以问题出在我身上。迁移和它现在是否正常工作。

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 2020-11-16
    • 2019-11-01
    • 2017-03-07
    • 2018-08-03
    • 1970-01-01
    • 2018-02-22
    • 2018-04-15
    • 2019-11-10
    相关资源
    最近更新 更多