简体   繁体   中英

Log file is not being written to from an HttpHandler

I want to capture all the requests going to *.jpg files on my server. To do so, I have created an HttpHandler whose code is as follows:

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;}}
    }
}

After compiling this and adding it to my web application's Bin directory as a deference, I added the following in my web.config file:

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

Then I also modified the IIS settings Home Directory -> Application Configuration and added aspnet_isapi.dll for the .jpg extension.

In the Handler, I have tried to write some stuff in the log file which I am creating in the C drive, but it is not writing to the log file and I am unable to find the bug.

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

Is this just a layout problem of stackoverflow or did you omit the asterisk (*):

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

If it's not missing asterisk, I would try to see the Network tab in Firebug on Firefox (or use Fiddler - a http debugging proxy). What HTTP response code do you get from the call?

Does the user your application is running under have access to C:\\? That's usually not the case; allowing an application context access to the root directory presents a big security risk.

Instead create a specific directory, for example c:\\logs and give the ASP.NET application pool's user account full rights to that directory alone.

Check your permissions.

You didn't hear this from me, but give "Everyone" full control to your C: and then run your test and see if the log file is created. (Right mouse click on C:, Properties, Security tab, etc...)

Don't forget to remove the permission when done.

Giving "Everyone" full control is just testing whether you're running into a permissions issue. If true, than you can fix it properly.

Don't forget to remove the permission when done.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM