如何知道已经请求了哪个Image C#,ASP.Net

时间:2008-12-22 06:44:51

标签: c# asp.net

我正在开发一个网络应用程序。这将生成一个指向我服务器上的图像的随机链接。类似于 - http://dummy.com/Images/Image1.jpg?id=19234

此处此链接可供其网站上的任何人使用,现在我只想知道有多少网站正在使用我的链接,而没有任何人点击这些链接。

可以使用HTTPModule吗?

4 个答案:

答案 0 :(得分:2)

这就像谷歌搜索一样简单吗?搜索

link:http://dummy.com/Images/Image1.jpg?id=19234

如果您想以编程方式执行此操作,则需要使用Google API。

答案 1 :(得分:1)

你对HttpHandler的问题在于它通常只会启动ASP.Net引擎处理的请求 - 图像请求通常由IIS处理,而不通过处理程序。

您的网络日志应该能够告诉您服务器上任何特定项目的引用者是谁 - 假设您拥有它们,并且您需要处理它们 - 这比使用Google更准确。

展望未来,我过去做过的一个方法就是让HttpHandler生成图像(实现IHttpHandler)。

这会将图像作为流返回(将内容类型设置为“image / jpeg”),并且可以添加进一步的处理(例如记录请求(引用者)来自的位置等)。

我在HttpHandler中发现的限制是,某些服务(例如PBBS)需要图像链接才能有图像扩展 - 我通过使用ASP.Net页面处理所有404来检查.jpg,从而解决了这个问题。请求中的扩展名。如果找到一个,而不是返回通常的404页面,则返回重新排列的图像。您需要在IIS中配置404处理程序,因为web.config错误处理程序仅针对ASP.Net请求(Web服务和.aspx类型页面)启动。

示例处理程序:

// Sample from the ASP.Net Personal Web Site Starter Kit
public class Handler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        // Set up the response settings
        context.Response.ContentType = "image/jpeg";
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
        context.Response.BufferOutput = false;

        // QueryString parameters are available here:
        // context.Request.QueryString["QueryStringKey"]

        // You can also access the Referrer object, and log the requests here.

        Stream stream;
        // Read your image into the stream, either from file system or DB
        if (stream == null)
        {
            stream = PhotoManager.GetPhoto();
        }

        // Write image stream to the response stream
        const int buffersize = 1024 * 16;
        var buffer = new byte[buffersize];
        int count = stream.Read(buffer, 0, buffersize);
        while (count > 0)
        {
            context.Response.OutputStream.Write(buffer, 0, count);
            count = stream.Read(buffer, 0, buffersize);
        }
    }
}

您可以在404页面中使用类似的代码(或者更好的方法,将主图像流代码重构为共享类),检查图像扩展的存在,并以这种方式呈现图像(同样,设置内容类型等。)

答案 2 :(得分:0)

Oddthinking是对的。请参阅http://code.google.com/intl/en/apis/ajaxsearch/documentation/#fonje_snippets或Google的API。他们给出了PHP和Java的例子,但也有ASP.NET的AJAX框架(http://www.asp.net/ajax/),我也确定C#。

答案 3 :(得分:0)

您可以将图片扩展名更改为aspx扩展名http://dummy.com/Images/Image1.aspx?id=19234),这里没有问题,因为这个页面唯一可以做的就是Response.OutputStream图片。也就是说它与jpg类似,但是有了优势,你可以使用其他一些代码进行处理。

在这个aspx中(在输出图像之前),我们会询问http_referer,如果这个注册表不存在,它将存储在数据表中。

如果您想限制对图像的访问,这非常有用。如果他们没有登录,你可以添加一些逻辑来禁止。