当多个用户创建用户时,会修改automapper错误集合

Baa*_*ali 5 vb.net asp.net-mvc dependency-injection automapper-3

我收到以下错误,只有当多个用户点击同一个按钮时才会出现此错误.任何帮助/想法将非常感激:

System.InvalidOperationException:集合已被修改; 枚举操作可能无法执行.生成:2015年6月10日星期三07:29:06 GMT

AutoMapper.AutoMapperMappingException:

映射类型:User - > User ApplicationSecurityManager.Service.User - > ApplicationSecurityManager.Models.User

目标路径:用户

源值:ApplicationSecurityManager.Service.User ---> System.InvalidOperationException:集合被修改; 枚举操作可能无法执行.在1.Enumerator.MoveNextRare() at AutoMapper.TypeMap.<get_AfterMap>b__1(Object src, Object dest) at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.Map(ResolutionContext context, IMappingEngineRunner mapper) at AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) --- End of inner exception stack trace --- at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) at AutoMapper.MappingEngine.Map[TDestination](Object source, ActionSystemSecurityManager.Infrastructure.ApplicationSecurityAttribute.OnAuthorization(AuthorizationContext filterContext)的ApplicationSecurityManager.UserManager.IsAuthenticated()的ApplicationSecurityManager.UserManager.get_AuthenticatedUser()处的ApplicationSecurityManager.UserManager.LoadUser(String username)处的System.Collections.Generic.List 1 opts) System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext,IList 1 filters, ActionDescriptor actionDescriptor) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult1.Begin(AsyncCallback回调,对象状态,Int32超时),位于System.Web.Mvc.Async.AsyncResultWrapper.Begin [TResult](AsyncCallback回调,对象状态,BeginInvokeDelegate) System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1 endDelegate, Object tag, Int32 timeout) at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TResult](AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate1的endDelegate,EndInvokeDelegate 1 endDelegate,Object tag)System.Web.Mvc.Controller.<> c__DisplayClass1d.b__17(AsyncCallback asyncCallback,Object asyncState)1.Begin(AsyncCallback callback, Object state, Int32 timeout) at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TResult](AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate1 endDelegate,Object tag,Int32 timeout )在System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback回调,对象统计)e)System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TResult](AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate1 endDelegate,Object tag,Int32 timeout)at System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback,Object state,BeginInvokeDelegate beginDelegate,EndInvokeDelegate endDelegate,Object tag) )System.Web.Mvc.Asv上的System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext,AsyncCallback callback,Object state).<> c__DisplayClass8.b__2(AsyncCallback asyncCallback,Object asyncState)1.Begin(AsyncCallback callback, Object state, Int32 timeout) at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TResult](AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegateSystem.Web.Mvc.MvcHandler上的System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback回调,对象状态,BeginInvokeDelegate beginDelegate,EndInvokeDelegate endDelegate,Object标记)中的.AsyncResultWrapper.WrappedAsyncResult 1 endDelegate,Object标记,Int32超时. System.Web.HttpApplic上System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()的BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态)ation.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)

这是构造函数,我认为aftermap是问题,但在调试时我没有收到错误.

Public Sub New(environmentCode As String, applicationCode As String)
    MyBase.New(environmentCode, applicationCode)

    SOBaseUrl = System.Configuration.ConfigurationManager.AppSettings(Enums.AppSettingKeys.SOBaseUrl.ToString())
    If Not String.IsNullOrEmpty(SOBaseUrl) Then
        SOBaseUrl = SOBaseUrl.TrimEnd("/")
    End If

    'Setup mapping.
    Mapper.CreateMap(Of Service.User, Models.User)() _
        .ForMember(Function(dest As Models.User) dest.ENumber, Sub(opt) opt.MapFrom(Function(src As Service.User) src.INumber)) _
        .AfterMap(Sub(src As Service.User, dest As Models.User)

            dest.Groups = New List(Of String)

            Using service = ApplicationSecurityManager.Service.Factory.GetService()

                Dim applicationPermissions = service.LoadPermissionsForUser(dest.Username, MyBase.EnvironmentCode)

                If (Not applicationPermissions Is Nothing AndAlso applicationPermissions.Any(Function(x) x.Code = MyBase.ApplicationCode)) Then

                    dest.Groups = applicationPermissions.Single(Function(x) x.Code = MyBase.ApplicationCode).GroupNames.ToList()

                End If

            End Using

        End Sub)
Run Code Online (Sandbox Code Playgroud)

Depenendency Injection Mapping:

container.RegisterType(Of IUserManager, UserManager)(New PerThreadLifetimeManager(),
    New InjectionConstructor(
      ConfigurationManager.AppSettings(Common.Enums.AppSettingKeys.Environment.ToString()),
      ConfigurationManager.AppSettings(Common.Enums.AppSettingKeys.ApplicationCode.ToString()))
    )
Run Code Online (Sandbox Code Playgroud)

saveUserResponse,错误被抛出.

 Public Function Create(user As Common.Models.User, approve As Boolean) As SO.Common.Models.User Implements IUserProvider.Save

    Dim saveUserResponse = UserManager.SaveUser(Mapper.Map(Of ApplicationSecurityManager.Service.User)(user))

    If Not String.IsNullOrEmpty(saveUserResponse.ErrorMessage) Then

        'The Security system returned an error.

        Throw New Exception("Security Service returned error: " & saveUserResponse.ErrorMessage)

    End If

    'Return the username.
    Return Mapper.Map(Of Common.Models.User)(saveUserResponse.User)

End Function
Run Code Online (Sandbox Code Playgroud)

Pau*_*lor 1

这是当多个用户修改映射的 AfterMap() 方法中的同一 user.Groups 集合时导致的。为了避免这种情况,请锁定正在处理集合的代码。例如:

'class level object
private object _myLock = New object()

'Setup mapping.
Mapper.CreateMap(Of Service.User, Models.User)() _
    .ForMember(Function(dest As Models.User) dest.ENumber, Sub(opt) opt.MapFrom(Function(src As Service.User) src.INumber)) _
    .AfterMap(Sub(src As Service.User, dest As Models.User)
                  SyncLock _myLock
                      dest.Groups = New List(Of String)

                      Using service = ApplicationSecurityManager.Service.Factory.GetService()

                          Dim applicationPermissions = service.LoadPermissionsForUser(dest.Username, MyBase.EnvironmentCode)

                          If (Not applicationPermissions Is Nothing AndAlso applicationPermissions.Any(Function(x) x.Code = MyBase.ApplicationCode)) Then

                              dest.Groups = applicationPermissions.Single(Function(x) x.Code = MyBase.ApplicationCode).GroupNames.ToList()

                          End If

                      End Using
                  End SyncLock

              End Sub)
Run Code Online (Sandbox Code Playgroud)