3

我想捕获所有发送到*.jpg我服务器上文件的请求。为此,我创建了一个 HttpHandler,其代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.IO;
using System.Globalization;

namespace MyHandler
{
    public class NewHandler : IHttpHandler
    {
        public NewHandler()
        {}

        public void ProcessRequest(System.Web.HttpContext ctx)
        {
            HttpRequest req = ctx.Request;
            string path = req.PhysicalPath;
            string extension = null;

            string contentType = null;           
            extension = Path.GetExtension(path).ToLower();

            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.Write("The page request is " + ctx.Request.RawUrl.ToString());
                StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true);
                sw.WriteLine("Page requested at " + DateTime.Now.ToString() 
                               + ctx.Request.RawUrl); sw.Close();

                ctx.Response.StatusCode = 200;
                ctx.Response.ContentType = contentType;
                ctx.Response.WriteFile(path);
            }
        }

        public bool IsReusable{get {return true;}}
    }
}

在编译它并将其添加到我的 Web 应用程序的Bin目录中作为参考后,我在我的web.config文件中添加了以下内容:

<system.web>
    <httpHandlers>
      <add verb="*" path="*.jpg" type="MyHandler.NewHandler,MyHandler"/>
    </httpHandlers>
</system.web>

然后我还修改了 IIS 设置Home Directory -> Application Configuration并添加aspnet_isapi.dll.jpg扩展。

在处理程序中,我尝试在 C 驱动器中创建的日志文件中写入一些内容,但它没有写入日志文件,我无法找到错误。

4

3 回答 3

3
<httpHandlers>
   <add verb="" path=".jpg" type="MyHandler.NewHandler,MyHandler"/>
</httpHandlers> 

这只是stackoverflow的布局问题还是您省略了星号(*):

<httpHandlers>
   <add verb="*" path="*.jpg" type="MyHandler.NewHandler,MyHandler"/>
</httpHandlers> 

如果它没有丢失星号,我会尝试在 Firefox 上的Firebug中查看“网络”选项卡(或使用Fiddler - http 调试代理)。您从调用中得到什么 HTTP 响应代码?

于 2008-12-22T10:33:06.267 回答
2

运行您的应用程序的用户是否有权访问 C:\?通常情况并非如此。允许应用程序上下文访问根目录会带来很大的安全风险。

而是创建一个特定目录,例如 c:\logs,并为 ASP.NET 应用程序池的用户帐户单独授予对该目录的完全权限。

于 2008-12-22T10:30:46.443 回答
0

检查您的权限。

你没有从我这里听到这个,但是让“每个人”完全控制你的 C: 然后运行你的测试,看看是否创建了日志文件。(鼠标右键单击 C:、属性、安全选项卡等...)

完成后不要忘记删除权限。

授予“所有人”完全控制权只是测试您是否遇到权限问题。如果属实,那么您可以正确修复它。

完成后不要忘记删除权限。

于 2013-07-23T13:39:35.393 回答