1

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

首先,我使用了一个模型,我将文件的路径放在一个锚标记中。每当用户单击此锚标记时,我都会生成一个 AJAX 请求来记录文件下载。

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

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

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

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

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

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

4

3 回答 3

3

您可以实现一个记录请求、检索文件并提供服务的 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);
        }
    }
}
于 2013-08-14T11:42:54.437 回答
1

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

编辑:对于 webforms 示例,请参阅这个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.
}
于 2013-08-14T11:40:07.170 回答
1

您可以使用 AJAX 方法,在链接中使用标识符作为参数值来引用文件 - 而不是存储完整路径 - 并让您的 Web 方法返回文件的序列化数据。

因此,您的 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 既可以处理日志记录也可以处理下载请求。

于 2013-08-14T11:40:14.543 回答