jcreamer898
jcreamer898

Reputation: 8189

.net MVC 3 Request event

I am a little new to .net and trying to grasp a few concepts.

I have been writing in Coldfusion for a while, and in CF there is an event under the Application.cfc called onRequest() that fires each time there is a page.

What in .net is used to capture the request information?

And moreover is there a way to latch on or extend the Request event to fire off my own events?

Upvotes: 3

Views: 5422

Answers (3)

LukLed
LukLed

Reputation: 31882

You can also find global.asax file and use one of events of HttpApplication class (for example BeginRequest):

http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx

HttpApplication has Request property.

You can catch every request there, not only related to Controller (images, css, wrong address).

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_BeginRequest(object sender, EventArgs e)
    {        
        //Request.Have_fun
    }    
}

If you don't want to write code in global.asax file, you should consider using HttpModule.

Create new class with this example code:

using System;
using System.Web;

namespace MyProject
{
    public class MyHttpModule : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.BeginRequest += ApplicationBeginRequest;
            application.EndRequest += ApplicationEndRequest;
        }

        private void ApplicationEndRequest(object sender, EventArgs e)
        {
            //do something here with HttpContext.Current.Request
        }

        private static void ApplicationBeginRequest(Object source, EventArgs e)
        {
            //do something here with HttpContext.Current.Request
        }


        public void Dispose()
        {
        }
    }
}

Add two entries in web.config (registers HttpModule):

<system.web>
  <httpModules>
    <add name="MyHttpModule" type="MyProject.MyHttpModule" />
  </httpModules>
</system.web>
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="MyHttpModule" type="MyProject.MyHttpModule" />
  </modules>
</system.webserver>

Because of changes in IIS7(adding system.webServer section), you have to add two entries in web.config.

Upvotes: 6

Ryan
Ryan

Reputation: 4313

If you are working in ASP.NET MVC 3 I would recommend using global action filters (use one per "event" you want to handle) instead of tapping directly into the ASP.NET Application/Request stack.

Upvotes: 1

Dan Atkinson
Dan Atkinson

Reputation: 11728

You'll probably want something like OnActionExecuting which is called before the action is hit.

To access the current request you could do the following:

protected virtual void OnActionExecuting(ActionExecutingContext filterContext) {
  //Do the default OnActionExecuting first.
  base.OnActionExecuting(filterContext);

  //The request variable will allow you to see information on the current request.
  var request = filterContext.RequestContext.HttpRequest;
}

If you want to access this in every controller, then you should probably create a base controller and add this there.

public class BaseController : Controller
{
  //Code above
}

And in your Home controller:

public class HomeController : BaseController
{
}

Upvotes: 4

Related Questions