我的网络API无声地崩溃,我不明白为什么。到目前为止,我有两个控制器,一个用于注册,在我创建第二个控制器之前完美运行。
注册控制器因500内部服务器错误和即时CORS错误而失败,说我的来源无法访问资源(我在不同的来源使用Angular)。我知道CORS不是问题,因为我早些时候工作了,其他控制器没有任何问题,我尝试了各种标签,使得CORS无济于事。
我最大的问题是它无声地失败 - 没有错误消息,没有弹出窗口,它甚至没有到达控制器的构造函数,因此我可以一步一步识别崩溃的位置 - 它只返回500而没有任何信息。< / p>
我猜它崩溃的原因是第二个控制器要求我创建一个继承IdentityUser的新模型,以便我可以扩展它,但这只是一个猜测 - 这是我第一次接触ASP.NET身份。我不知道如何调试这个问题......
我不知道这个问题来自哪里,所以我不能在这里粘贴任何代码。您可以在此处找到存储库:https://github.com/Marred/Informakcja它可以正常工作2提交回来。我没有搞乱Angular代码,因为我已经开始工作,所以99%是后端问题。
答案 0 :(得分:1)
我从Github克隆了你的存储库并在我的机器上构建了解决方案。正如您所提到的,InformationController
工作正常,问题出在AccountController
。它与CORS
无关。
当我尝试从REST客户端点击api/Account/login
时,我收到以下错误,状态代码为500
:
An unhandled exception occurred while processing the request.InvalidOperationException: Unable to resolve service for type x27;Microsoft.AspNetCore.Identity.SignInManager '1[Microsoft.AspNetCore.Identity.IdentityUser]' while attempting to activate x27;Informakcja_api.Controllers.AccountController'.Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
SignInManager
和UserManager
中的数据模型应与services.AddIdentity
中的Startup.cs
相同。
解决您的问题的方法是,在Startup.cs
文件中进行以下更改。
更改
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
要
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
这样您就可以点击AccountController
。希望这会有所帮助:)
另一个解决方案是保持Startup.cs不变。将Account Controller
更改为以下代码。
public class AccountController : Controller
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
private readonly IConfiguration _configuration;
public AccountController(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IConfiguration configuration)
{
_signInManager = signInManager;
_userManager = userManager;
_roleManager = roleManager;
_configuration = configuration;
}
//Rest of your code
}