C# ASP.NET MVC捆绑包中存在500个内部服务器错误
我确实使用ASP.NET MVC绑定来绑定我的JavaScript文件。当我检查并检查浏览器中的网络选项卡时,当我的捆绑包要加载时,我会看到C# ASP.NET MVC捆绑包中存在500个内部服务器错误,c#,asp.net-mvc,asynchronous,async-await,bundle,C#,Asp.net Mvc,Asynchronous,Async Await,Bundle,我确实使用ASP.NET MVC绑定来绑定我的JavaScript文件。当我检查并检查浏览器中的网络选项卡时,当我的捆绑包要加载时,我会看到500内部服务器错误。 答复: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全 我知道这个错误发生在我的GenerateIdentityAsync方法中。 我使用ASP.NET Identity 2.0,因此我在Owin启动类的OnValidate
500内部服务器错误
。
答复:
在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全
我知道这个错误发生在我的GenerateIdentityAsync
方法中。
我使用ASP.NET Identity 2.0,因此我在Owin启动类的OnValidateIdentity
中使用它:
ApplicationManager.cs
public class ApplicationManager : IApplicationManager
{
// more code
public Func<CookieValidateIdentityContext, Task> OnValidateIdentity()
{
return SecurityStampValidator.OnValidateIdentity<AppUserManager, User, Guid>
(TimeSpan.FromSeconds(0), GenerateIdentityAsync, identity => Guid.Parse(identity.GetUserId()));
}
public async Task<ClaimsIdentity> GenerateIdentityAsync(AppUserManager manager, User user)
{
var identity =
await CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie).ConfigureAwait(true);
identity.AddEnumClaim("lastSeenMode", user.LastSeenMode);
identity.AddClaim(new Claim("emailAddress", user.Email));
identity.AddClaim(new Claim("displayName", user.DisplayName));
identity.AddClaim(new Claim("lastseen", user.LastSeen.ToString()));
return identity;
}
}
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
Provider = new CookieAuthenticationProvider()
{
OnValidateIdentity = SmObjectFactory.Container.GetInstance<IAppUserManager>().OnValidateIdentity(),
}
});
此外,我还测试了ConfigureAwait(true)
和ConfigureAwait(false)
以及不测试ConfigureAwait(true)
,但没有解决此问题
更新:另外,当我使用时,它说在多个线程中使用单个对象上下文很可能是一个Bug。 此警报仅针对同一个表存在:
[Admin].[UserClaims]
[Admin].[UserLogin]
[Admin].[Roles]
[Admin].[UserRoles]
[Admin].[Users]
我如何解决这个问题
中的更多代码我自己不使用StructureMap,但我发现对于MVC来说,将StructureMap与MVC结合使用的最佳方法是安装软件包(这是最新的StructureMap版本)。
检查一下如何使用它。或文章
将所有现有注册码移动到由软件包安装的DefaultRegistry.cs。现在不要使用HybridHttpOrthReadLocalScope()注册服务。我自己不使用StructureMap,但我发现对于MVC来说,将StructureMap与MVC结合使用的最佳方法是安装包(这是最新的StructureMap版本)。
检查一下如何使用它。或文章
将所有现有注册码移动到由软件包安装的DefaultRegistry.cs。现在不要使用
HybridHttpOrthReadLocalScope()
进行服务注册。您在某个地方同时启动了对数据库的两个异步请求。检查您错过使用wait的地方。我没有错过使用wait
。您可以将post异常调用堆栈添加到问题中吗?@vitaliysmolyakov问题已更新。您如何创建IdentityDbContext?必须为每个请求创建新的。如果多个请求确实共享一个IdentityDbContext实例,那么这就是问题的根源——多个请求可以使用一个上下文同时访问数据库。您在某个地方同时启动了对数据库的两个异步请求。检查您错过使用wait的地方。我没有错过使用wait
。您可以将post异常调用堆栈添加到问题中吗?@vitaliysmolyakov问题已更新。您如何创建IdentityDbContext?必须为每个请求创建新的。如果多个请求确实共享一个IdentityDbContext实例,那么这就是问题的根源——多个请求可以使用一个上下文同时访问DB。
[Admin].[UserClaims]
[Admin].[UserLogin]
[Admin].[Roles]
[Admin].[UserRoles]
[Admin].[Users]