Search code examples
c#asp.netasp.net-identityowin

OWin Appbuilder rebuilding the app 70 -125 times per event


I've been following several tutorial on integrating the OWin identity in my ASP.net app, for instance this one

So my StartupLogin now has the method

public static void ConfigureAuth(IAppBuilder app)
{
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
    app.CreatePerOwinContext<ApplicationRoleManager>(Application‌​RoleManager.Create);

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
    [...]

to create (and I quote the link) "a per-request, single instance of the UserManager and DbContext classes from the OWIN context to be used throughout the application."

But I saw very weird calling behavior to the Create functions, so I added the class

class DebugManager : IDisposable
{
    private static int count = 0;
    public static DebugManager Create() { Debug.WriteLine($"Owin Build called {count++};"); return new DebugManager(); }
    public void Dispose() { }
}

and the line

app.CreatePerOwinContext(DebugManager.Create);

Looking at the debug window, I saw that the Create() methods are called 74 times on initial application startup, and 120-124(!!!!) times on other actions like login, page refresh, logout, etc, etc...

That cannot be the way it should work, right? A create function should only be called once, where after you can get the instance of the object via the OWinContext.Get<>, right? What's going on here?


Solution

  • I found the answer here

    Dependency Injection in Owin

    ... each time the OwinContext is pulled from the HttpContext, it returns a new context ... if we are applying DI terms here, then your object is registered in per-request scope, as you would expect to be DbContext.

    And I recently learned the difference between "transient", "scoped" and "singleton" in this answer.

    It turns out a page request of our (very large) project (in development mode, where caching of static files is off) causes 125 requests to server, which caused the issue.