2015-03-02 1 views
2

После question как почему почему ApplicationDbContext из Asp.Net Identity создается и удаляется дважды за запрос. Я сделал некоторое исследование, почему это произойдет. Я обнаружил, что ApplicationDbContext фактически создан один раз за HttpRequest, но при использовании Owin-конвейера промежуточное ПО Owin будет создано во второй раз после окончания HttpRequest.Почему промежуточное программное обеспечение owin создано во второй раз после окончания HttpRequest

Из-за этого ApplicationDbContext действительно создается во второй раз, когда пользователь нажимает на одну ссылку, создавая впечатление, что объект создается дважды за WebRequest.

После много исследований я решил запустить простой проект MVC 5 без использования какой-либо аутентификации. После добавления промежуточного ПО Owin из NuGet я создал следующий компонент: Owin Middleware. Что в основном проверяет, существует ли какой-то поддельный объект в словаре HttpContext и создает его, когда он этого не делает. Результат записывается в окно отладки, чтобы все было просто.

[assembly: OwinStartupAttribute(typeof(MvcPlain.Startup))] 
namespace MvcPlain 
{ 
    public class Startup { 
     public static int Counter; 
     public static string FakeKeyName; 

     public void Configuration(IAppBuilder app) { 
      app.Use(async (context, next) => 
      { 
       Debug.WriteLine("Owin middleware entered => begin request"); 

       FakeKeyName = "owinKey" + Counter.ToString(); 
       var fakeKeyPresent = HttpContext.Current.Items.Contains(FakeKeyName); 

       Debug.WriteLine(string.Format("{0} key present in HttpContext?: {1}", 
                 FakeKeyName, fakeKeyPresent)); 

       if (!HttpContext.Current.Items.Contains(FakeKeyName)) 
       { 
        Counter += 1; 
        HttpContext.Current.Items.Add(FakeKeyName, "someValue"); 
       } 

       await next.Invoke(); 

       Debug.WriteLine("Owin middleware exited => end request"); 

       var keyStillPresent = HttpContext.Current.Items.Contains(FakeKeyName); 
       Debug.WriteLine(string.Format("{0} still present in HttpContext?: {1}", 
                 FakeKeyName, keyStillPresent)); 
      }); 
     } 
    } 
} 

Затем добавляют это к Index ActionMethod в HomeController, чтобы проверить, если создаваемый объект все еще существует.

public ActionResult Index() 
{ 
    Debug.WriteLine("Index actionmethod called"); 
    var fakeKeyPresent = HttpContext.Items.Contains(Startup.FakeKeyName); 

    Debug.WriteLine(string.Format("{0} key present in HttpContext?: {1}", 
              Startup.FakeKeyName, fakeKeyPresent)); 

    return View(); 
} 

Когда запускали выходное окно показывает следующий вывод (добавлен комментарий для ясности):

--- home link clicked --- 
Owin middleware entered => begin request 
owinKey2 key present in HttpContext?: False 
Index actionmethod called 
owinKey2 key present in HttpContext?: True 
Owin middleware exited => end request 
owinKey2 key still present in HttpContext?: True 
--- end of 'normal' request --- 
Owin middleware entered => begin request 
owinKey3 key present in HttpContext?: False 
Owin middleware exited => end request 
owinKey3 key still present in HttpContext?: True 

Так почему же, после комментария end of 'normal' request, создается промежуточное и снова вошел? У кого-нибудь есть идеи или объяснения?

Шаги для воспроизведения:

  1. Начните новый проект MVC 5 в VS 2013 без аутентификации
  2. Добавить Owin из NuGet используя Install-Package Microsoft.Owin.Host.SystemWeb в менеджере пакетов
  3. Добавьте класс запуска к проекту, как показано выше
  4. Добавьте код в Index ActionMethod в HomeController
  5. Hit F5 в режиме отладки
  6. Нажмите на ссылку «Home» на стартовой странице
  7. Watch выход на выходе (или немедленное в зависимости от вашей установки VS) окном
+0

Вы уверены, что нет второго запроса на что-то вроде значка fav, исходных карт, ссылки на браузер или что-то в этом роде? Можете ли вы распечатать URL-адреса HttpRequests – Stilgar

ответ

5

Что, скорее всего, что здесь происходит то, что есть фактически два отдельные запросы. Первый - для вашего Домашнего/Индекса, а второй, вероятно, является браузером, который делает запрос на что-то вроде favicon.ico. (Браузеры обычно делают это автоматически.)

В начале вашего промежуточного программного обеспечения вставьте помощник для отладки, который показывает значение context.Request.Path, чтобы узнать, какой URL-адрес запрашивается каждый раз.

+0

Это похоже на это. Но я в замешательстве. В вышеупомянутом тестовом проекте это действительно так. Но: Вчера я использовал шаблон с Asp.Net Identity, создать его для выпуска и размещать в реальной сети IIS и записывать выше информацию в текстовый файл. В этом случае браузер не работает и все еще происходит ...? Любые идеи, значки? –

+0

Это был скорее всего запрос 'favicon.ico'. Это довольно глобальное поведение большинства браузеров, независимо от того, какой сайт просматривается. –

Смежные вопросы