我這就要求我的WebAPI同時有兩個控制檯應用程序和我回去在控制檯應用程序從我的API後續反應:C#的WebAPI異步方面的問題
第二次手術就這樣開始了上下文之前一先前的異步操作完成。在調用此上下文中的另一個方法之前,請使用'await'來確保任何異步操作已完成。任何實例成員不保證是線程安全的。
所以他們在同一時間調用我的webapi,然後webapi內的某些東西無法處理這兩個異步調用,因此返回此錯誤。
我檢查了webapi項目上的所有代碼,所有的方法都是異步的,所以我不明白爲什麼我會得到這個。
這是webapi的代碼。
控制器:
public class FederationsController : ApiController
{
private readonly IFederationRepository _federationRepository;
public FederationsController(IFederationRepository federationRepository)
{
_federationRepository = federationRepository;
}
[HttpGet]
[Route("federations", Name = "GetFederations")]
public async Task<IHttpActionResult> GetFederations()
{
var federations = await _federationRepository.GetAllAsync();
return Ok(federations.ToModel());
}
}
庫
public class FederationRepository : IFederationRepository, IDisposable
{
private Models.DataAccessLayer.CompetitionContext _db = new CompetitionContext();
#region IQueryable
private IQueryable<Models.Entities.Federation> FederationWithEntities()
{
return _db.Federations.Include(x => x.Clubs)
.Where(x => !x.DeletedAt.HasValue && x.Clubs.Any(y => !y.DeletedAt.HasValue));
}
#endregion IQueryable
public async Task<IEnumerable<Models.Entities.Federation>> GetAllAsync()
{
return await FederationWithEntities().ToListAsync();
}
}
映射器
public static class FederationMapper
{
public static List<Federation> ToModel(this IEnumerable<Models.Entities.Federation> federations)
{
if (federations == null) return new List<Federation>();
return federations.Select(federation => federation.ToModel()).ToList();
}
public static Federation ToModel(this Models.Entities.Federation federation)
{
return new Federation()
{
Name = federation.Name,
FederationCode = federation.FederationCode,
CreatedAt = federation.CreatedAt,
UpdatedAt = federation.UpdatedAt
};
}
}
的DbContext
public class CompetitionContext : DbContext
{
public CompetitionContext() : base("ContextName")
{
}
public DbSet<Federation> Federations { get; set; }
}
UnityConfig
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<IFederationRepository, FederationRepository>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
}
感謝您所有的意見/幫助。
我會檢查看看是否有導致您的統一登記搞砸,它表現得像一個IFederationRepository是在請求之間共享。嘗試在統一註冊中明確地設置一個'TransientLifetimeManger'來查看它是否改變了任何東西。 –
@ScottChamberlain我試過這個container.RegisterType(new HierarchicalLifetimeManager());但如果那是你的意思,那也沒有解決問題。 –
Nick
'HierarchicalLifetimeManager'是使用絕對錯誤的管理器,您需要每個解決方案的類的新副本。你需要一個'TransientLifetimeManger' –