设计-记录用户下载

本文关键字:下载 用户 记录 设计 | 更新日期: 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.
}