日志文件未从HttpHandler写入

时间:2008-12-22 10:26:50

标签: c# asp.net ihttphandler

我想捕获发送到我服务器上*.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;}}
    }
}

在编译完并将其作为deference添加到我的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

在Handler中,我试图在我在C盘中创建的日志文件中写一些东西,但它没有写入日志文件,我无法找到错误。

3 个答案:

答案 0 :(得分: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响应代码?

答案 1 :(得分:2)

您的应用程序运行的用户是否可以访问C:\?这通常是的情况;允许应用程序上下文访问根目录会带来很大的安全风险。

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

答案 2 :(得分:0)

检查您的权限。

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

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

赋予“Everyone”完全控制权只是测试您是否遇到了权限问题。如果是真的,那么你可以正确地修复它。

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