Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Website Slow At Loading The Login Form

I have an ASP.NET MVC website which I am developing, and I recently deployed it on a test server so the client could give some initial feedback.

I have noticed that on the live server there is a considerable delay in loading the login form, of around 20-30 seconds. Once you are logged in, the system functions just fine, and is responsive.

If you log out, and return to the login page, it is once again slow.

It doesn't appear to be an issue with the apppool spooling up, as it happens every time on the page, not just once, and all items appear to be loading.

Any suggestions on how to debug this?

Below is the BaseController from which all controllers enherit, plus the account login controller.

protected override void ExecuteCore()
    {



        if (User.Identity.IsAuthenticated)
        {
            try
            {
                AccountDataContext = new AccountDAL.DataContext(ConfigurationManager.AppSettings["Server"]);
                // set the current user. 
                CurrentUser = AccountDataContext.Users.FirstOrDefault(x => x.Email == User.Identity.Name);
                AccountDataContext.CurrentAccount = CurrentUser.Account;
                ViewBag.CurrentUser = CurrentUser;
                ViewBag.Account = CurrentUser.Account;

                SystemDataContext = new SystemDAL.DataContext(ConfigurationManager.AppSettings["Server"], CurrentUser.Account.Database);

                // setup the account based on the users settings
                ViewBag.Theme = "Default"; // hard coded for now
            }
            catch (Exception)
            {
                // if the previous threw an exception, then the logged in user has been deleted
                // log them out
                FormsAuthentication.SignOut();
                Session.Abandon();

                // clear the authentication cookie
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
                cookie.Expires = DateTime.Now.AddYears(-1);
                Response.Cookies.Add(cookie);

                FormsAuthentication.RedirectToLoginPage();
            }
        }

        base.ExecuteCore();
    }

and the Accounts controller:

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {

            if(AccountDataContext == null)
                AccountDataContext = new AccountDAL.DataContext(ConfigurationManager.AppSettings["Server"]);

            var user = AccountDataContext.Users.FirstOrDefault(x => x.Email == model.UserName && x.Password == model.Password);
            if (user != null)
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
like image 881
Gavin Coates Avatar asked Sep 29 '22 10:09

Gavin Coates


2 Answers

Couple of things will improve performance:

  • First and foremost : Deploy your site in Release mode if you care anything at all about performance. Here a great article from Dave Ward about it.

    <compilation targetFramework="your framework version" debug="false">

  • If you are not using webforms view engine (Which i assume you are not) jus disable it and use Razor only and to take it a little further, allow just chtml files

    ViewEngines.Engines.Clear(); IViewEngine RazorEngine = new RazorViewEngine() { FileExtensions = new string[] { "cshtml" } }; ViewEngines.Engines.Add(RazorEngine);

  • Configure Idle Time-out Settings for an Application Pool (IIS 7) Here's the link


EDIT1:

Based on your last comment mentioning that the app is running fine in your local IIS. I would recommend that you start focusing on analyzing the requests on your remote IIS , here's a link to a tool that you can use.

In order to trace successful requests as well (And you should do that in your case) set the status to 200 here's a tutorial on that as well.

like image 69
IndieTech Solutions Avatar answered Oct 06 '22 20:10

IndieTech Solutions


As the slowdown only seems to affect the login pages, I took a closer look at the Account controller which they both use (no other account functions implemented at this time).

I found the following code at the top of the controller:

public AccountController()
         : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

Removing this declaration cured the issue. I'm not sure what it is or where it came from, I think it's from the original MS default implementation authentication. I don't have an ApplicationDbContext, so I think it was waiting on this request to time out before proceeding.

like image 43
Gavin Coates Avatar answered Oct 06 '22 20:10

Gavin Coates