ASP.. NET ImageHandler输出Url的内容

本文关键字:Url 输出 NET ImageHandler ASP | 更新日期: 2023-09-27 17:50:51

我有一个使用ImageHandler输出图像的asp.net web表单应用程序。基本上是为了防止窃取,但也从另一个服务器获取图像文件。

下面是ProcessRequest的实现:

public void ProcessRequest(HttpContext ctx)
    {
        HttpRequest req = ctx.Request;
        string path = req.PhysicalPath.ToLower();
        string extension = Path.GetExtension(path);
        if (req.UrlReferrer != null && req.UrlReferrer.Host.Length > 0)
        {
            if (CultureInfo.InvariantCulture.CompareInfo.Compare(req.Url.Host, req.UrlReferrer.Host, CompareOptions.IgnoreCase) != 0)
            {
                path = ctx.Server.MapPath("~/images/noimage.jpg");
            }
        } 
        // Rewrite path if not in production
        if (imagePath != null)
        {
            if (path.Length > path.IndexOf("''images''", StringComparison.Ordinal) + 7)
            {
                string end = path.Substring(path.IndexOf("''images''", StringComparison.Ordinal) + 7);
                path = string.Concat(imagePath, end).Replace("''", "/");
            }
        }
        string contentType;
        switch (extension)
        {
            case ".gif":
                contentType = "image/gif";
                break;
            case ".jpg":
                contentType = "image/jpeg";
                break;
            case ".png":
                contentType = "image/png";
                break;
            default:
                throw new NotSupportedException("Unrecognized image type.");
        }
        if (!File.Exists(path))
        {
            ctx.Response.Status = "Image not found";
            ctx.Response.StatusCode = 404;
        }
        else
        {
            ctx.Response.StatusCode = 200;
            ctx.Response.ContentType = contentType;
            ctx.Response.WriteFile(path);
        }
    }

上面的代码失败了,因为我想将路径重写为url而不是文件路径。我想重写的原因是因为实际的映像文件在另一台服务器上,不能通过UNC路径访问。我做错了什么,有可能做到这一点吗?

欢呼

ASP.. NET ImageHandler输出Url的内容

当您在调用这个处理程序时-那么您就没有更多的能力重写您的路径,因为我看到您试图这样做。

重写路径是告诉IIS和asp.net,例如对http://www.url.com/one/page1.aspx的调用由http://www.url.com/someotherpage.aspx?id=one

提供。

你都准备好了,不是对你的数据进行最后的处理,在那里你必须读取文件并将其发送到浏览器,例如:

 public void ProcessRequest(HttpContext context)
    {
      // your first code
      // ...
       if (!File.Exists(path))
        {
            ctx.Response.Status = "Image not found";
            ctx.Response.StatusCode = 404;
        }
        else
        {
            // load here the image 
            ....
            // and send it to browser
            ctx.Response.OutputStream.Write(imageData, 0, imageData.Length);
        }
    }