我想建立一个"审计线索"对于传入服务器的所有请求,但每个网页需要根据每个用户的具体要求。
例如,我想象这样的事情:
在初始视图渲染中,我会存储(cookie / page variable / something)一个唯一的Id,表示用户浏览到/myapp.com/dashboard/1234。 - 也许在layout.cshtml中。
然后,应用程序向服务器发出X个GET / POST请求,每个请求具有最初与呈现的视图相关联的相同唯一ID。
这使我可以绑定所有页面请求并添加服务器执行时间。
我尝试使用特定于路径的Cookie,但由于用户可以使用相同的网址打开许多标签,因此我无法完成这项工作。此外,用户可以同时在应用程序的许多区域中工作。他们可以打开1到10多个标签。这些中的每一个都应该拥有它自己独特的Id和"审计线索"在该页面上发生的所有电话。
这是一个现有的应用程序,因此修改每个GET / POST以传递唯一ID都超出了范围。只是希望我错过了一些可能会解决这个问题的事情。
谢谢!
答案 0 :(得分:0)
编写一个ActionFilter来执行此操作。这个有很多例子
http://rion.io/2013/04/15/creating-advanced-audit-trails-using-actionfilters-in-asp-net-mvc/
http://blog.ploeh.dk/2014/06/13/passive-attributes/
我个人更喜欢Mark Seemann的例子,因为它清楚地定义了属性和过滤器的关注点。
答案 1 :(得分:0)
如果我正确理解您,您可以加载一个页面,然后为图像和其他资源或您希望与初始页面加载相关联并跟踪的AJAX请求发出其他请求。
您在这里遇到的主要问题是,根据HTTP的工作方式,每个请求都会作为自己的事物处理,而不会被视为更大整体的一部分。 Web浏览器使它看起来无缝,但所有Web服务器正在做的只是响应一堆(据其所知)不同的不同事物的请求。要将它们全部作为一个单元进行跟踪,您需要将一些唯一ID附加到请求本身(对于GET,它可以作为URI路径或查询字符串的一部分),也可以依靠Session
来引入请求之间的状态。但是,当所有请求都可以绑定到单个初始请求时,会话状态实际上仅适用于此方案。一旦用户开始同时处理多个不同的页面,就没有理由辨别哪个请求属于什么,并且您回到了同一条船上。
换句话说,你唯一真正的选择就是发送一些请求,这意味着做一些事情:
<link rel="stylesheet" type="text/css" href="/path/to/file.css?origin=@Request.RawUrl" />
然后,您可以拥有一个动作过滤器,在任何请求的查询字符串中查找origin
,并将其与该特定页面的日志记录联系起来。
对于它的价值,应该注意的是,默认情况下,IIS将直接处理所有静态资源请求,而不涉及ASP.NET。如果你确实想跟踪静态资源的请求,你必须通过ASP.NET传递它们,这将是一种痛苦。如果您只想跟踪AJAX请求,那就更简单了,并且在大多数情况下都不需要任何特殊的东西。
所有这一切,如果唯一的目的是跟踪页面加载时间,那么有更好,更简单的方法。你可以安装Glimpse。您可以使用浏览器的开发者控制台。您可以使用Google Analytics之类的内容。对于页面加载统计信息,所有这些都远远优于您在此处的路径。