【问题标题】:Webapi Response 500 Internal Server ErrorWebapi 响应 500 内部服务器错误
【发布时间】:2018-07-23 13:18:23
【问题描述】:

我制作了一个 asp.net core web api 并实现了一些注册用户的逻辑。 但问题是,每当我从邮递员那里调用控制器时,它都会给我 500 内部服务器错误。我还实现了一个简单的 IActionResult 来返回欢迎消息,这也不起作用。这是我的代码。

[ApiController]
[Route("api/[controller]")]

public class AuthController : Controller
{
    private readonly IAuthRepository _repo;
    public AuthController(IAuthRepository repo)
    {
        _repo = repo;
    }

    [HttpPost("register")]
    public async Task<IActionResult> Register([FromBody]CreateUserDTO createUserDto)
    {
        createUserDto.Username=createUserDto.Username.ToLower();
        if(await _repo.UserExists(createUserDto.Username))
            return BadRequest("User With This User Name Already Exists");
        var userToCreate=new User
        {
            UserName=createUserDto.Username
        };

        var createdUser=await _repo.Register(userToCreate,createUserDto.Password);

        return Ok("user registered");
    }

    [HttpGet]
    public IActionResult Get()
    {
        var message="welcome message";
        return Ok(message);
    }


}

期待很快收到您的来信。 谢谢

【问题讨论】:

  • 这意味着您的代码正在崩溃。设置断点,看看发生了什么。
  • Hy Shyju,我正在使用 vscode,我也尝试过这个断点。但是当我从邮递员那里发起呼叫时,控制权并没有发生。我有一个非常简单的值控制器,效果很好。
  • 在您的操作中实现日志记录并使用 try/catch 是一种很好的做法。
  • 你在构造函数中放了断点吗?如果您是 IOC 没有正确传递 repo,它会在代码进入 Get 操作之前给您一个硬错误
  • 嗨,马克·菲茨帕特里克,感谢您的帮助。是的,问题出在我的 AuthRepository 的构造函数上。我忘记将 public 修饰符赋予构造函数。但现在一切都很好并且工作正常。

标签: asp.net-mvc asp.net-web-api asp.net-core


【解决方案1】:

我发现了问题所在。 问题出在我的 AuthRepository 构造函数上,我没有指定 public 修饰符。 这是我的 AuthRepository 代码(工作)

public class AuthRepository : IAuthRepository
{
    private readonly ApplicationDatabase _db;

    public  AuthRepository(ApplicationDatabase db)
    {
        _db = db;
    }
    public async  Task<User> Login(string username, string password)
    {
        var user=await _db.Users.Where(x=>x.UserName==username).FirstOrDefaultAsync();

        if (user==null)
            return null;
        if(!verifyPasswordHash(password,user.PasswordHash,user.PasswordSalt))
            return null;

        return user;
    }

    private bool verifyPasswordHash(string password, byte[] passwordHash, byte[] passwordSalt)
    {
        using(var hmac=new System.Security.Cryptography.HMACSHA512(passwordSalt))
        {
            var computedPasswordHash=hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
            for (int i = 0; i < computedPasswordHash.Length; i++)
            {
                if (computedPasswordHash[i]!=passwordHash[i])
                {
                    return false;
                }
            }
        }
        return true;
    }

    public async Task<User> Register(User user, string password)
    {
        byte[] passwordHash,passwordSalt;
        CreatePasswordHashSalt(password,out passwordHash,out passwordSalt);
        user.PasswordHash=passwordHash;
        user.PasswordSalt=passwordSalt;
        await _db.Users.AddAsync(user);
        _db.SaveChangesAsync();
        return user;
    }

    private void CreatePasswordHashSalt(string password, out byte[] passwordHash, out byte[] passwordSalt)
    {
        using(var hmac=new System.Security.Cryptography.HMACSHA512())
        {
            passwordSalt=hmac.Key;
            passwordHash=hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
        }
    }

    public async Task<bool> UserExists(string username)
    {
        if(await _db.Users.AnyAsync(x=>x.UserName==username))
            return true;

        return false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2015-08-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多