После 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
, создается промежуточное и снова вошел? У кого-нибудь есть идеи или объяснения?
Шаги для воспроизведения:
- Начните новый проект MVC 5 в VS 2013 без аутентификации
- Добавить Owin из NuGet используя
Install-Package Microsoft.Owin.Host.SystemWeb
в менеджере пакетов - Добавьте класс запуска к проекту, как показано выше
- Добавьте код в
Index
ActionMethod вHomeController
- Hit F5 в режиме отладки
- Нажмите на ссылку «Home» на стартовой странице
- Watch выход на выходе (или немедленное в зависимости от вашей установки VS) окном
Вы уверены, что нет второго запроса на что-то вроде значка fav, исходных карт, ссылки на браузер или что-то в этом роде? Можете ли вы распечатать URL-адреса HttpRequests – Stilgar