2016-10-03 65 views
1

我想为传入服务器的所有请求构建一个“审计线索”,但它需要针对每个用户,每个网页特定。为每个网页的用户记录所有请求

比如我想是这样的:

  1. 在初始视图渲染我将存储(饼干/页变量/别的东西)一个唯一的ID称用户浏览到/myapp.com/dashboard/ 1234。 - 也许在layout.cshtml中。

  2. 然后,应用程序触发X个GET/POST请求到服务器,每个请求都具有最初绑定到呈现视图的相同唯一标识。

这使我可以绑定页面的所有请求并加起来服务器执行时间。

我尝试使用路径特定的Cookie,但这不会工作我意识到,因为用户可以有许多标签打开相同的网址。此外,用户还可以一次在应用程序的许多区域工作。他们可以打开1到10个以上的选项卡。其中每一个都应该有它自己独特的ID和在该页面上发生的所有呼叫的“审计线索”。

这是一个现有的应用程序,因此修改每个GET/POST以传入唯一标识超出范围。只是希望我错过了可能会照顾到这一点的事情。

谢谢!

回答

0

如果我正确地理解了你,你有一个单一的页面加载,然后为图像和其他资源或AJAX请求附加请求,你想要绑定和追踪与该初始页面加载。

这里你会遇到的主要问题是,根据HTTP的工作方式,每个请求都被当作自己的东西来处理,而不被视为更大整体的一部分。 Web浏览器使它看起来都是无缝的,但所有的Web服务器正在做的只是响应一堆(据其知道)各种不同事物的无关请求。要将它们全部作为一个单元进行跟踪,您需要将一些唯一ID附加到请求本身(对于GET,这可以作为URI路径或查询字符串的一部分),也可以依靠Session来在请求之间引入状态。但是,当所有请求都可以绑定到单个初始请求时,会话状态仅适用于此场景。一旦用户开始一次处理多个不同的页面,就没有理由辨别出哪个请求属于哪个请求,并且您又回到了同一条船上。

换句话说,你的唯一真正的选择是与请求一起发送的东西,这意味着做这样的事情:

<link rel="stylesheet" type="text/css" href="/path/to/[email protected]" /> 

然后,你可以有一个动作过滤器,在查询查找origin任何请求的字符串,并将其绑定到该特定页面的日志记录。

值得注意的是,默认情况下,IIS将直接处理所有静态资源请求,而不涉及ASP.NET。如果你确实想跟踪静态资源的请求,你必须通过ASP.NET传递它们,这会很痛苦。如果你只想跟踪AJAX请求,那就简单多了,而且大多数情况下不需要特别的东西。

所有这一切说,如果唯一的目的是跟踪页面加载时间,有更好更简单的方法来做到这一点。你可以安装Glimpse。您可以使用浏览器的开发人员控制台。您可以使用Google Analytics等内容。对于页面加载统计信息,所有这些都比你在这里下载的路径要好得多。

+0

我觉得这是不可能的,没有修改每个请求附加一个ID传回。这是我最初想到的,也不想走这条路。只是想也许,也许,有人解决了这个问题:)谢谢 – blatantlyObvious

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/

很多例子我个人很喜欢马克·西曼的例子更多,因为它明确规定了对于属性和过滤器关注一个很好的分离。

+0

我已经在使用过滤器来处理日志记录(不是我需要帮助的)。 这仍然不能唯一标识来自/myapp.com/dashboard1/123与/myapp.com/otherthings/123的请求。我需要知道页面+用户特定的请求跟踪。在包含用户信息的服务器上获取原理没有问题。 – blatantlyObvious

+0

为什么不工作filterContext.HttpContext.Request.Url或filterContext.HttpContext.Request.RawUrl来获取url – Fran

+0

试过。它适用于POST,但是在GET Request.Url,RawUrl,AbsoluteUri与当前网址栏中的内容不匹配。他们是行动发生的乌里。唯一匹配的是UrlReferrer,但这并不总是我的可靠来源,因为我们实际上可能会重定向它们(并且在这种情况下会是一个新视图,从而启动一个全新的审计试用版)...此外,这不会如果他们有两个相同的页面打开工作,因为它会显示相同的网址。 – blatantlyObvious