【发布时间】:2018-07-31 17:31:54
【问题描述】:
我只是在尝试开发一个用于身份验证和授权的示例项目,并点击链接
ASP.NET Core MVC: Authentication and Role Based Authorisation with Identity
运行代码时出现错误
堆栈跟踪:
[MissingMethodException: 没有为此定义无参数构造函数 对象。] System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis、布尔填充缓存、StackCrawlMark 和 stackMark)+119
System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +247 System.Activator.CreateInstance(类型类型,布尔非公共)+83 System.Activator.CreateInstance(类型类型)+11 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55[InvalidOperationException: 尝试创建一个错误 “SampleAuthProject.Controllers.HomeController”类型的控制器。 确保控制器有一个无参数的公共构造函数。] System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,类型控制器类型)+178
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型控制器类型)+76
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称)+88
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext、IController&控制器、IControllerFactory&工厂) +194 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback 回调, 对象状态) +50
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback 回调,对象状态)+48
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext 上下文,AsyncCallback cb,对象 extraData)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep 步骤) +48 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean & completedSynchronously) +159
我认为这个错误是由于 DI 造成的。
所以在我的 startup.cs 中包含
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
public Startup()
{
var builder = new ConfigurationBuilder();
Configurations = builder.Build();
}
public IConfigurationRoot Configurations { get; }
public void ConfigureServices(IServiceCollection services)
{
try
{
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configurations.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();
}
catch (Exception ex)
{
throw ex;
}
}
public void Configure(IApplicationBuilder app,
IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseIdentity();
}
我的 HomeController 是
[Microsoft.AspNetCore.Authorization.Authorize]
public class HomeController : Controller
{
private readonly UserManager<ApplicationUser> userManager;
public HomeController(UserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}
[Microsoft.AspNetCore.Authorization.Authorize(Roles = "User")]
public ActionResult Index()
{
//userManager=new UserManager<ApplicationUser>();
string userName = userManager.GetUserName(System.Security.Claims.ClaimsPrincipal.Current);
return View("Index",userName);
}
}
【问题讨论】:
-
如果你有一个无参数的构造函数,它可以工作吗?
-
不,userManager 变为空
-
图片是从右侧剪切的,您能否发布整个错误消息
-
确定,错误信息已更新
-
@Jinesh 你确定你使用的是核心项目吗?跟踪中的那些命名空间来自 MVC 5。看来您正在尝试混合框架版本。
标签: c# asp.net-core dependency-injection asp.net-core-identity