设计-记录用户下载
本文关键字:下载 用户 记录 设计 | 更新日期: 2023-09-27 18:27:49
我必须记录从网站上抓取的每个文件的下载请求。此日志必须包含员工ID、解决方案ID和IP地址。我用了很多方法-
首先,我使用了一个模型来放置文件的路径在锚点标签中。每当用户点击这个锚点标签时,我正在生成AJAX请求以记录文件下载。
但这样做的巨大缺点是,用户只需复制文件并将其粘贴到一个单独的窗口中即可获得文件。这将确保下载不会被记录。
秒,当我在页面中的web方法中处理ajax请求时。我尝试通过HttpResponse传输文件,但也没有成功。
HttpContext.Current.Response.TransmitFile("filename");
jQueryajax调用一直失败,我从未在客户端获得过该文件。
关键是,我必须在不刷新页面的情况下完成整件事。
我想知道这是否可能。。。
您可以实现一个IHttpHandler来记录请求、检索文件并提供服务。这样,即使直接复制和粘贴链接,它也会记录它。
public class SimpleHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { string fileToServe = context.Request.QueryString["file"]; if (!string.IsNullOrEmpty(fileToServe)) { //Log request here... context.Response.ContentType = "content type for your file here"; context.Response.WriteFile("~/path/" + fileToServe); } } }
您可以使用AJAX方法,在链接中使用一个标识符作为引用文件的参数值,而不是存储完整路径,并让您的web方法返回文件的序列化数据。
所以,你的网络方法可能看起来像这样:
[WebMethod]
public static string GetDownload(string someIdentifier) {
// get the contents of your file, then...
// do your logging, and...
var serializer = new JavaScriptSerializer();
return serializer.Serialize(fileByteArrayOrSuch);
}
然后在客户端处理文件内容。毫无疑问,为了日志记录,您的函数中会添加一些更琐碎的元素;但最重要的是,AJAX既可以处理日志,也可以处理下载请求。
这是非常可能的–您需要返回一个文件作为对操作(Mvc)或aspx页面(webforms)的响应。因此,当操作或aspx页面被点击时,您可以记录请求并将文件写入响应。
编辑:对于网络表单示例,请参阅此SO问题
对于mvc:
public ActionResult DownloadFile(string fileHint)
{
// log what you want here.
string filePath = "determine the path of the file to download maybe using fileHint";
return File(filePath, "application/octet-stream"); // second argument represents file type; in this case, it's a binary file.
}