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.
来源:https://stackoverflow.com/questions/385945/log-file-is-not-being-written-to-from-an-httphandler