为什么在HttpRequest结束后第二次创建owin中间件 - c#

根据为何创建Asp.Net Identity的ApplicationDbContext并为每个请求进行两次处置后,我做了一些研究,研究了为什么会发生这种情况。我发现ApplicationDbContext实际上实际上是每个HttpRequest创建一次,但是当使用Owin管道时,将在HttpRequest结束后第二次创建Owin中间件。

因此,当用户单击一个链接时,确实会第二次创建ApplicationDbContext,给人的印象是,每个WebRequest创建对象两次。

经过大量研究,我决定不使用任何身份验证就开始一个简单的MVC 5项目。从NuGet添加Owin中间件后,我创建了以下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));
            });
        }
    }
}

然后将其添加到IndexHomeController ActionMethod中,以检查创建的对象是否仍然存在。

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之后创建中间件并再次输入呢?有人有任何想法或解释吗?

重现步骤:

无需身份验证即可在VS 2013中启动新的MVC 5项目
使用包管理器中的Install-Package Microsoft.Owin.Host.SystemWeb从NuGet添加Owin
如上所示,将启动类添加到项目中
将代码添加到IndexHomeController ActionMethod中
在调试模式下按F5
单击开始页面上的“主页”链接
在“输出”(或取决于您的VS设置)窗口中观看输出

参考方案

这里最有可能发生的事情是实际上发生了两个单独的请求。第一个用于您的“主页/索引”视图,第二个可能是浏览器请求诸如favicon.ico之类的内容。 (浏览器倾向于自动执行此操作。)

在中间件的开头,插入一个调试助手,该助手显示context.Request.Path的值以查看每次请求的URL。

HttpContext Cookie - c#

if (HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie") && !String.IsNullOrEmpty(HttpContext.Current.Request.Cookies["myCookie"].Value)) { …

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…

Json到php,json_decode返回NULL - php

我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…