有没有办法在ASP.NET / IIS 7中检测热链接图像视图? 我不想阻止观看者,当有人在谷歌图片搜索中点击我的图片时,我只需要为每个静态图像增加图像视图计数器。
答案 0 :(得分:2)
这很简单。您只需检查Referrer请求标头,如果请求与您的本地域不匹配,请记录该请求。这样的事情应该有效:
using System;
using System.Linq;
using System.Web;
namespace ImageLogger
{
public class ImageLoggerModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.LogRequest += new EventHandler(context_LogRequest);
}
void context_LogRequest(object sender, EventArgs e)
{
var context = HttpContext.Current;
// perhaps you have a better way to check if the file needs logging,
// e.g.: it is a file in a certain folder
switch (context.Request.Url.AbsolutePath.Split('.').Last().ToLower())
{
case "png":
case "jpg":
case "gif":
case "bmp":
if (context.Request.UrlReferrer != null)
{
if (!"localhost".Equals(
context.Request.UrlReferrer.Host,
StringComparison.CurrentCultureIgnoreCase)
)
{
// request is not from local domain --> log request
}
}
break;
}
}
public void Dispose()
{
}
}
}
在web.config中,您可以在模块部分链接此模块:
<system.webServer>
<modules>
<add name="ImageLogger" type="ImageLogger.ImageLoggerModule"/>
这仅适用于IIS中的集成模式 - 在经典模式下,ASP.NET永远不会获取静态文件的任何事件。
现在我考虑一下;你可以完全废弃当前的日志记录(在页面中,我猜?),只需使用这个模块,并摆脱引用者逻辑。这样,您只有一个地方可以进行日志记录。