我在我的asp.net web api项目中收到此错误,我怀疑是由于我在配置容器时必须犯的一些错误:
GenericArguments [0],' Model.AppUser',on' Microsoft.AspNet.Identity.IUserStore`2 [TUser,TKey]'违反了类型参数约束' TUser'。
这是我在startup.cs文件中注册此类型的方法:
builder.RegisterType<UserStore<AppUser>>().As<IUserStore<AppUser, Guid>>().InstancePerRequest();
以下是我的课程:
public class AppUser : ModelBase, IUser<Guid>
{
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? DOB { get; set; }
// other fields omitted for brevity ...
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser, Guid> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim(ClaimTypes.Email, this.Email));
if (!string.IsNullOrWhiteSpace(this.FirstName))
{
userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, this.FirstName));
}
if (!string.IsNullOrWhiteSpace(this.LastName))
{
userIdentity.AddClaim(new Claim(ClaimTypes.Surname, this.LastName));
}
return userIdentity;
}
}
public class UserStore<TUser> : IUserLoginStore<TUser, Guid>,
IUserClaimStore<TUser, Guid>,
IUserPasswordStore<TUser, Guid>,
IUserSecurityStampStore<TUser, Guid>,
IUserEmailStore<TUser, Guid>,
IUserPhoneNumberStore<TUser, Guid>,
IUserTwoFactorStore<TUser, Guid>,
IUserLockoutStore<TUser, Guid>,
IUserStore<TUser, Guid>
where TUser : AppUser
{
private bool _disposed;
private readonly IUserRepository _userRepo;
private readonly IUserClaimRepository _userClaimRepo;
private readonly IGenericRepository<AppUserLogin, Guid> _userLoginRepo;
public UserStore(IUserRepository userRepo, IUserClaimRepository userClaimRepo,
IGenericRepository<AppUserLogin, Guid> userLoginRepo)
{
_userRepo = userRepo;
_userClaimRepo = userClaimRepo;
_userLoginRepo = userLoginRepo;
}
public Task CreateAsync(TUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
_userRepo.Add(user);
return Task.FromResult<object>(null);
}
// other methods omitted for brevity
}
有趣的是,我注册我的类型的方式在asp.net MVC项目中完美运行,但不是在web api中。我现在收到此错误的原因是我已决定将所有安全问题(即登录,注销,注册等)移至我的网络API层。
到目前为止,谷歌搜索还没有多大帮助。有什么想法吗?更新1 09/04 12:30 PM GMT - 添加了堆栈跟踪
&#39; /&#39;中的服务器错误应用。 GenericArguments [0], &#39; Model.AppUser&#39;,开启 &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了 类型参数的约束&#39; TUser&#39;。描述:未处理 在执行当前Web请求期间发生异常。 请查看堆栈跟踪以获取有关错误的更多信息 它起源于代码。
异常详细信息:System.TypeLoadException:GenericArguments [0], &#39; Model.AppUser&#39;,开启 &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了 类型参数的约束&#39; TUser&#39;。
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈追踪:
[TypeLoadException:GenericArguments [0], &#39; Model.AppUser&#39;,开启 &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了 类型参数的约束&#39; TUser&#39;。] System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle句柄,IntPtr * pInst,Int32 numGenericArgs,ObjectHandleOnStack type)+0
System.RuntimeTypeHandle.Instantiate(Type [] inst)+94
System.RuntimeType.MakeGenericType(Type [] instantiation)+209[ArgumentException:GenericArguments [0], &#39; Model.AppUser&#39;,开启 &#39; Microsoft.AspNet.Identity.IUserStore
2[TUser,TKey]' violates the constraint of type 'TUser'.]
2.MoveNext()+157 System.Linq.d__14
System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e) +4182003
System.RuntimeType.MakeGenericType(Type[] instantiation) +225
Autofac.Features.Variance.<>c__DisplayClass8.<RegistrationsFor>b__2(Type[] a) +13 System.Linq.WhereSelectEnumerableIterator2.MoveNext() +393
2.MoveNext()+81
System.Linq.WhereSelectEnumerableIterator
Autofac.Core.Registration.ComponentRegistry.GetInitializedServiceInfo(服务 服务)+268
Autofac.Core.Registration.ComponentRegistry.RegistrationsFor(服务 服务)+87
Autofac.Core.Registration.d__a.MoveNext()+301
Autofac.Core.Registration.ComponentRegistry.GetInitializedServiceInfo(服务 服务)+268
Autofac.Core.Registration.ComponentRegistry.TryGetRegistration(服务 服务,IComponentRegistration&amp;注册)+82
Autofac.Core.Activators.Reflection.AutowiringParameter.CanSupplyValue(的ParameterInfo pi,IComponentContext context,Func1& valueProvider) +124
1 availableParameters,IComponentContext context)+213 Autofac.Core.Activators.Reflection&LT;&GT; c__DisplayClass5.b__4(ConstructorInfo ci)+34 System.Linq.WhereSelectArrayIterator
Autofac.Core.Activators.Reflection.ConstructorParameterBinding..ctor(ConstructorInfo ci, IEnumerable2.MoveNext() +66
1.MoveNext()+85
System.Linq.WhereEnumerableIterator
System.Linq.Buffer1..ctor(IEnumerable
1来源)+132
System.Linq.Enumerable.ToArray(IEnumerable1 source) +77
1个参数)+154
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) +48
1创作者)+120
Autofac.Core.Resolving.InstanceLookup.<Execute>b__0() +7
Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func
Autofac.Core.Resolving.InstanceLookup.Execute()+132
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration注册, IEnumerable1 parameters) +133
1个参数)+24
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable
Autofac.Core.Registration&LT;&GT; c__DisplayClass8.b__3(IComponentContext c,IEnumerable1 p) +19
1个参数)+32
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable
1个参数)+133
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration 注册,IEnumerable1 parameters) +24
1参数)+185
Autofac.Core.Activators.Reflection.<>c__DisplayClass2.<CanSupplyValue>b__0() +31 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() +94 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable
1个参数)+133
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration 注册,IEnumerable1 parameters) +24
1 p)+19
Autofac.Core.Registration.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext 上下文,IEnumerable1 parameters) +32
1 参数)+48 Autofac.Core.Resolving.InstanceLookup.Execute()+48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration注册, IEnumerable
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) +133
1个参数)+44
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable[DependencyResolutionException:抛出异常时 执行解析操作。有关详细信息,请参阅InnerException。 ---&GT; GenericArguments [0],&#39; Model.AppUser&#39;,on&#39; Microsoft.AspNet.Identity.IUserStore
2[TUser,TKey]' violates the constraint of type 'TUser'. (See inner exception for details.)]
1个参数)+112
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration 注册,IEnumerable1 parameters) +109
1个参数,对象&amp;实例) +74 Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext 上下文,服务服务,IEnumerable`1参数)+53
Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable
Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(类型 serviceType)+59
System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext requestContext,Type controllerType)+41[InvalidOperationException:尝试创建时出错 控制器类型&#39; UI.Controllers.AccountController&#39;。使 确保控制器具有无参数的公共构造函数。]
System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext requestContext,Type controllerType)+178
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(的RequestContext requestContext,Type controllerType)+77
System.Web.Mvc.DefaultControllerFactory.CreateController(的RequestContext requestContext,String controllerName)+88
Castle.Proxies.Invocations.IControllerFactory_CreateController.InvokeMethodOnTarget() +118 Castle.DynamicProxy.AbstractInvocation.Proceed()+80 Glimpse.Core.Extensibility.CastleInvocationToAlternateMethodContextAdapter.Proceed() +11 Glimpse.Core.Extensions.AlternateMethodContextExtensions.TryProceedWithTimer(IAlternateMethodContext 上下文,TimerResult&amp; timerResult)+41
Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext 上下文)+25
Glimpse.Core.Extensibility.AlternateTypeToCastleInterceptorAdapter.Intercept(IInvocation 调用)+84 Castle.DynamicProxy.AbstractInvocation.Proceed() +108 Castle.Proxies.IControllerFactoryProxy.CreateController(RequestContext requestContext,String controllerName)+214
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController&amp;控制器,IControllerFactory&amp;厂) +191 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的 context,AsyncCallback cb,Object extraData)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155