2016-11-04 20 views
6

Мне задали вопрос в интервью, что как реализовать HTTP module и HTTP handler в ASP.Net MVC. Я знаю, что они используются в ASP.Net для написания логики предварительной обработки до того, как вызывается страница aspx. Но в ASP.Net MVC у нас есть фильтры для этого, поэтому я сказал им, что для этого мы используем фильтры. Я дал правильный ответ?HTTP-модули и HTTP-обработчики в ASP.Net MVC?

+0

Фильтры вызываются только для запросов, обрабатываемых контроллерами. Чтобы быть более общим, вам придется использовать IHttpHandler и IHttpModule ... если вы не в OWIN, в этом случае это будет класс OWIN Middleware. – Dai

+0

Я не привел тебя сюда. Я не уверен в OWIN –

ответ

5

Фильтры действий позволяют подключаться только к событиям MVC, тогда как HTTP-модули позволяют подключаться к событиям ASP.Net, поэтому даже в MVC для реализации HTTP-модуля и HTTP-обработчика вам потребуется реализовать соответствующий интерфейс. Кроме того, если вы хотите, чтобы ваши функции выполнялись только один раз за запрос Http, вы должны использовать HttpModule. ActionFilters могут выполняться несколько раз за одну поездку на сервер. Чтобы объяснить HTTP-модули и обработчики HTTP, HTTP-модуль и HTTP-обработчик используются MVC для ввода логики предварительной обработки в цепочке запросов.

Обработчики HTTP являются предварительным процессором на основе расширения, тогда как HTTP-модуль - это препроцессор на основе событий. Например, если вы хотите изменить способ обработки файлов jpg, вы создадите собственный обработчик HTTP, а если вы хотите выполнить дополнительную логику во время обработки запроса, вы реализуете настраиваемый HTTP-модуль. Для конкретного запроса всегда есть только один обработчик HTTP, но может быть несколько HTTP-модулей.

Чтобы реализовать обработчик HTTP, вы реализуете класс IHTTPHandler и реализуете методы ProcessRequest и свойство IsResuable. Свойство IsResuable определяет, можно ли повторно использовать обработчик или нет.

public class MyJpgHandler: IHttpHandler { 
    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
    public void ProcessRequest(HttpContext context) { 
    } 
} 

Далее нам нужно указать, какой тип запроса будет обработан нашим персонализированного обработчика в web.config файле:

<httpHandlers> 
    <add verb="*" path="*.jpg" type="MyJpgHandler"/> 
</httpHandlers> 

Для реализации модуля HTTP, нам необходимо реализовать IHttpModule и зарегистрировать требуемые события in init способ. В качестве простого примера, если мы хотим, чтобы регистрировать все запросы:

public class MyHttpModule: IHttpModule { 
    public MyHttpModule() {} 
    public void Init(HttpApplication application) { 
     application.BeginRequest += new EventHandler(this.context_BeginRequest); 
     application.EndRequest += new EventHandler(this.context_EndRequest); 
    } 
    public void context_BeginRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("request began at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 

    public void context_EndRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("Request Ended at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 
    public void Dispose() {} 
} 

И зарегистрировать наш модуль:

<httpModules> 
    <add name="MyHttpModule " type="MyHttpModule " /> 
</httpModules>