根据为何创建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));
});
}
}
}
然后将其添加到Index
的HomeController
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
如上所示,将启动类添加到项目中
将代码添加到Index
的HomeController
ActionMethod中
在调试模式下按F5
单击开始页面上的“主页”链接
在“输出”(或取决于您的VS设置)窗口中观看输出
参考方案
这里最有可能发生的事情是实际上发生了两个单独的请求。第一个用于您的“主页/索引”视图,第二个可能是浏览器请求诸如favicon.ico
之类的内容。 (浏览器倾向于自动执行此操作。)
在中间件的开头,插入一个调试助手,该助手显示context.Request.Path
的值以查看每次请求的URL。
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…