#c# #asp.net-core #asp.net-core-webapi
Вопрос:
Я пытался собраться с мыслями, пытаясь решить эту проблему, и я заглянул в Интернет, чтобы найти соответствующую информацию по этому вопросу. Я не смог решить эту проблему.
Мое приложение использует веб-API, который уже существовал в качестве шаблона для этого проекта. Я думаю, что это может быть причиной проблемы. У меня нет большого опыта в этом, и у меня заканчиваются идеи для решения этой проблемы.
Дополнительный вопрос будет заключаться в том, как использовать другие контроллеры без активных конфигураций веб-API.
На веб-странице отображается ошибка с URL-адресом: https://localhost:(номер удален)/api
Если кому-то нужен какой-либо другой код, пожалуйста, спросите, и я отредактирую сообщение, так как я не слишком уверен, где все нужно искать.
Мой стартовый файл:
public class Startup
{
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.
public void ConfigureServices(IServiceCollection services)
{
// ** Add Cookie Authentication via extension method **
//services.AddCookieAuthentication();
// ** Add Cookie and Jwt Authentication via extension method **
services.AddCookieAndJwtAuthentication(Configuration);
// ** Enable Cors for and webapi endpoints provided **
services.AddCors();
// Add UserService to DI - change to use real UserService
services.AddTransient<SolutionNameService,SolutionNameServiceDb>();
// ** Required to enable asp-authorize Taghelper **
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider provider)
{
if (env.IsDevelopment())
{
//app.UseDeveloperExceptionPage();
// seed users - using service provider to get UserService from DI
Seeder.Seed(provider.GetService<SolutionNameService>());
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
// ** configure cors to allow full cross origin access to any webapi end points **
app.UseCors(c => c.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
// ** turn on authentication/authorisation **
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Файл программы
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
ApiUserController
// ** This is a Demo WebAPI Controller provides User Login Using JWT Token **
[ApiController]
[Route("api")]
// set default auth scheme as we are using both cookie and jwt authentication
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class UserApiController : ControllerBase
{
private readonly IPatientHutService _svc;
private readonly IConfiguration _config; // jwt settings
public UserApiController(IPatientHutService service, IConfiguration _configuration)
{
_config = _configuration;
_svc = service;
}
// POST api/login
[AllowAnonymous]
[HttpPost("login")]
public ActionResult<User> Login(UserLoginViewModel login)
{
var user = _svc.Authenticate(login.Email, login.Password);
if (user == null)
{
return BadRequest(new { message = "Email or Password are incorrect" });
}
// sign jwt token to use in secure api requests
var authUser = SignInJwt(user);
return Ok(authUser);
}
// POST api/login
[AllowAnonymous]
[HttpPost("register")]
public ActionResult<User> Register(UserRegisterViewModel reg)
{
var user = _svc.AddUser(reg.Name, reg.Email, reg.Password, reg.Role);
if (user == null)
{
return BadRequest(new { message = "User Could not be Registered" });
}
// sign jwt token to use in secure api requests
var authUser = SignInJwt(user);
return Ok(authUser);
}
// Sign user in using JWT authentication
private UserAuthenticatedViewModel SignInJwt(User user)
{
return new UserAuthenticatedViewModel
{
Id = user.Id,
Name = user.Name,
Email = user.Email,
Role = user.Role,
Token = AuthBuilder.BuildJwtToken(user, _config),
};
}
}
Комментарии:
1. Можете ли вы опубликовать трассировку стека исключений или ошибку экрана?
2. @GabrielFrancisco Когда я создаю проект, никаких проблем не обнаружено и не отображается никаких ошибок, но на веб-странице в Google отображается ошибка 500 и говорится, что локальный хост не может обработать ошибку. Если в visual studio есть другой способ получить то, о чем вы просите. Дайте мне знать, и я немедленно опубликую его
3. Похоже на сбой при запуске, потому что вызов GetRequiredService в Configure очень подозрителен. В случае, если это является причиной, то в сигнатуре метода Configure вы можете просто ввести зависимость в службу следующим образом: `Configure(INeededDependency, ioterstuff)
4. Код состояния HTTP 500 означает «внутренняя ошибка сервера», вы должны проверить эту ошибку в подтверждении.
Ответ №1:
Добавьте IPatientHutService и реализацию в методе ConfigureServices.
Чтобы просмотреть подробные сообщения об ошибках, раскомментируйте строку.
//app.UseDeveloperExceptionPage();
Комментарии:
1. Это не решило бы проблему (это не должно быть ответом), но это был бы хороший комментарий в вопросе, поэтому ОП использует его и может отредактировать вопрос с фактической ошибкой, которую он/она получил.
2. @Cleptus, я согласен, но в то время у меня не было достаточно очков, чтобы сделать комментарий.
3. @GabrielFrancisco и все остальные! Спасибо всем за комментарии, но я смог сам решить эту проблему. Раскомментируйте приложение.UseDeveloperExceptionPage действительно помогло!