ASP.NET MVC и ASP.NET Web Forms используют одну и ту же инфраструктуру маршрутизации, в которой обеим фреймворкам в конечном итоге потребуется IHttpHandler
для обработки HTTP-запроса:
Интерфейс IHttpHandler является частью ASP.NET с
начало, а веб-форма (System.Web.UI.Page) является IHttpHandler.
(из статьи в MSDN, указанной в вопросе)
В ASP.NET MVC используется класс System.Web.Mvc.MvcHandler
, , который затем делегируется контроллеру для дальнейшей обработки запроса. В веб-формах ASP.NET обычно используется класс System.Web.UI.Page
, представляющий файл .aspx, но также может использоваться pure IHttpHandler
, связанный с файлом .ashx.
Таким образом, вы можете направить обработчик .ashx в качестве альтернативы странице веб-форм .aspx. Оба реализуют IHttpHandler
(как и MvcHandler
), но с первым это все, что он делает. И это как можно ближе к «чистому классу», обрабатывающему (маршрутизируемый) запрос. А поскольку часть обработчика является просто интерфейсом, вы можете наследовать от своего собственного класса.
<%@ WebHandler Language="C#" Class="LightweightHandler" %>
using System.Web;
public class LightweightHandler : YourBaseClass, IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello world!");
}
public bool IsReusable { get { return false; } }
}
Обратите внимание, что IRouteHandler
просто нужно вернуть экземпляр IHttpHandler
:
public IHttpHandler GetHttpHandler(RequestContext requestContext);
Возможно, вам придется перепрыгнуть через несколько обручей, чтобы создать экземпляр вашего обработчика, используя BuildManager *, если вы используете файлы .ashx. Если нет, вы можете просто создать экземпляр своего класса и вернуть его:
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// In case of an .ashx file, otherwise just new up an instance of a class here
IHttpHandler handler =
BuildManager.CreateInstanceFromVirtualPath(path, typeof(IHttpHandler)) as IHttpHandler;
// Cast to your base class in order to make it work for you
YourBaseClass instance = handler as YourBaseClass;
instance.Setting = 42;
instance.DoWork();
// But return it as an IHttpHandler still, as it needs to do ProcessRequest
return handler;
}
См. Ответы на этот вопрос для более глубокого анализа маршрутизации чистых IHttpHandlers: Можно ли использовать маршрутизацию ASP.NET для создания «чистых» URL-адресов для обработчиков .ashx (IHttpHander)?
** Я не совсем уверен в примере BuildManager, кто-то, пожалуйста, поправьте меня, если я ошибся в этой части *