Asp.Net Core 2 Web API 500 внутренняя ошибка сервера

когда я пытаюсь получить доступ к API через Postman,

Отправлять:

локальный: 5050 / api / Auth / токен

Тело:

{"UserName": "jouverc", "Password": "P @ ssw0rd!" }

к этому методу:

[Produces("application/json")]
[Route("api/Auth")]
public class AuthController : Controller
{

    #region constructor injection

    private readonly IPasswordHasher<User> _hasher;
    private readonly UserManager<User> _userManager;
    private readonly IConfigurationRoot _config;
    private readonly SignInManager<User> _signInManager;

    public AuthController(IPasswordHasher<User> hasher, UserManager<User> userManager, SignInManager<User> signInManager, IConfigurationRoot config)
    {
        _hasher = hasher;
        _userManager = userManager;
        _signInManager = signInManager;
        _config = config;
    }

        #endregion

    #region createToken

    [HttpPost("token")]
    public async Task<IActionResult> CreateToken([FromBody] CredentialModel model)
    {
        try
        {
            var user = await _userManager.FindByNameAsync(model.UserName); 
            if (user != null) 
            {
                if (_hasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) == PasswordVerificationResult.Success)  
                {
                    return Ok(CreateToken(user)); 
                }
            }
        }
        catch (Exception)
        {
            //log 
        }
        return null;
    }

    private async Task<JwtPacket> CreateToken(User user)
    {
        var userClaims = await _userManager.GetClaimsAsync(user); 

        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.UserName), 
            new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()) 
        }.Union(userClaims);


        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
        var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 
        var token = new JwtSecurityToken(issuer: _config["Tokens:Issuer"], 
            audience: _config["Tokens:Audience"],
            claims: claims,
            expires: DateTime.UtcNow.AddDays(2),
            signingCredentials: cred
        );
        return new JwtPacket
        {
            Token = new JwtSecurityTokenHandler().WriteToken(token),
            Expiration = token.ValidTo.ToString(),
            UserName = user.UserName
        };

    }

    public class JwtPacket
    {
        public string Token;
        public string UserName;
        public string Expiration;
    }

    #endregion

}

Я получаю внутреннюю ошибку сервера 500:

Невозможно разрешить службу для типа Microsoft.Extensions.Configuration.IConfigurationRoot при попытке активировать WebAPI.Controllers.AuthController

как мне настроить автозагрузку?

 public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.

person Anil    schedule 23.02.2018    source источник


Ответы (3)


Просто измените IConfigurationRoot на IConfiguration в конструкторе контроллера.

Но что может быть лучше, так это использовать шаблон IOpions для ввода настроек в ваш контроллер.

person Ryan Dobbs    schedule 23.02.2018

В .NET core 2.0

IConfigurationRoot теперь просто IConfiguration.

В этом документе объясняется: Переход с 1.x на 2.0.

В 2.0 проектах шаблонный код конфигурации, присущий 1.x проектам, выполняется за кулисами. Например, переменные среды и настройки приложения загружаются при запуске. Эквивалентный Startup.cs код сокращается до IConfiguration инициализации с внедренным экземпляром:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }
person Anton Toshik    schedule 23.02.2018
comment
как вы сказали, но я не знаю, в чем проблема. Есть что-то еще, что я пропустил, есть идеи? - person Anil; 23.02.2018
comment
Ошибка говорит, что не может найти службу от DI. Вам необходимо изменить IConfigurationRoot на IConfiguration в контроллере. - person juunas; 23.02.2018

Если вы просто читаете значения из appsettings.json, используйте вместо этого интерфейс IConfiguration.

Вот как это реализовать в классе Startup

public Startup(IApplicationEnvironment appEnv)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(appEnv.ApplicationBasePath)
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json");
    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; set; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IConfiguration>(Configuration);
}
person Marcus Höglund    schedule 23.02.2018