【问题标题】:Design - Log user downloads设计 - 记录用户下载
【发布时间】:2013-08-14 19:54:40
【问题描述】:

我必须记录从网站上抓取的每个文件的下载请求。此日志必须包含员工 ID、解决方案 ID、IP 地址。我用过不少方法-

首先,我使用的是放置文件路径的模型 在锚标签中。每当用户点击这个锚标签时,我 正在生成 AJAX 请求以记录文件下载。

但这样做的巨大缺点是用户只需复制文件并将其粘贴到单独的窗口中即可获取文件。这将确保下载没有被记录。

第二, 当我在页面中的 web 方法中处理 ajax 请求时。我尝试通过 HttpResponse 传输文件,但也没有用。

HttpContext.Current.Response.TransmitFile("filename");

jQuery ajax 调用一直失败,我从来没有在客户端获取文件。

关键是,我必须在不刷新页面的情况下完成整个操作。

我想知道这是否可能......

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    您可以实现一个 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);
            }
        }
    }
    

    【讨论】:

    • 谢谢!这就是我最终实施的! :)
    【解决方案2】:

    您可以使用 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 既可以处理日志记录然后处理下载请求。

    【讨论】:

    • 那么,我得把文件转换成字节数组并返回?
    • var serializer = new JavaScriptSerializer();return serializer.Serialize(File.ReadAllBytes("D:\\DSC_0396.png"));data.d 内的数组中给我一堆数字...
    【解决方案3】:

    这很有可能——您需要将文件作为对操作 (Mvc) 或 aspx 页面 (webforms) 的响应返回。因此,当点击操作或 aspx 页面时,您可以记录请求并将文件写入响应。

    编辑:对于网络表单示例,请参阅SO question

    对于 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.
    }
    

    【讨论】:

    • 抱歉,仅限 ASP.NET Web 表单
    • @AbijeetPatro 正如我的回答中提到的,您可以查看 this SO question 以从 aspx 页面返回文件。在 page_load 上,您可以记录用户请求,然后按照该链接中的说明将文件写入 Response。
    • 我无法重新加载页面。 :(
    猜你喜欢
    • 2012-02-16
    • 2012-09-29
    • 2020-12-13
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2010-09-09
    • 2022-10-15
    • 2012-11-23
    相关资源
    最近更新 更多