ASP.NET检测热链接图像视图

时间:2014-10-09 20:48:30

标签: asp.net iis-7 hotlinking

有没有办法在ASP.NET / IIS 7中检测热链接图像视图? 我不想阻止观看者,当有人在谷歌图片搜索中点击我的图片时,我只需要为每个静态图像增加图像视图计数器。

1 个答案:

答案 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永远不会获取静态文件的任何事件。

现在我考虑一下;你可以完全废弃当前的日志记录(在页面中,我猜?),只需使用这个模块,并摆脱引用者逻辑。这样,您只有一个地方可以进行日志记录。