Могут ли веб-формы и общие обработчики (файлы Ashx) иметь общий класс предков (или базовую страницу)? - PullRequest
0 голосов
/ 06 октября 2010

Если у вас есть веб-сайт ASP.net, веб-формы которого все наследуют от общей базовой страницы - которая проверяет такие вещи, как аутентификация и перенаправляет по истечении сеанса и т. Д. - есть ли способ использовать этот базовый класс в обработчик Ashx? Я начал идти по этому пути, унаследовав базовый класс страниц в обработчике, и понял, что это не рекомендуется. Любые мысли о том, как избежать дублирования кода здесь?

Может это

public class FooHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {

стать этим

public class FooHandler : BasePageClass, IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {

Я получаю следующее предупреждение, которое заставило меня пересмотреть то, что я делал:

FooHandler.ProcessRequest (System.Web.HttpContext) скрывает унаследованный член System.Web.UI.Page.ProcessRequest (System.Web.HttpContext). Чтобы переопределить эту реализацию, добавьте ключевое слово переопределения. В противном случае добавьте новое ключевое слово.

Ответы [ 2 ]

3 голосов
/ 30 января 2014

Если вы установите родительский класс ProcessRequest как виртуальный, вы можете переопределить его в дочернем классе и вызвать метод базового класса изнутри переопределенного метода.

public abstract class ParentHandler : IHttpHandler, IRequiresSessionState
{
    protected WebConnectHandler Context;

    public virtual void ProcessRequest(HttpContext context)
    {
        Context = new WebConnectHandler(context);
    }

    //...
}

//...
public class ChildHandler : ParentHandler
{
    public override void ProcessRequest(HttpContext context)
    {
        base.ProcessRequest(context);
        //the rest of your code
    }
}
//...
1 голос
/ 06 октября 2010

Теперь вы понимаете, почему типы гуру ОО всегда голосуют за композицию, а не за наследование.В любом случае, делать именно то, что вы хотите, довольно сложно, так как в System.Web.UI.Page реализован IHttpHandler (если я правильно помню), существует множество внутренних обработок, которые вы не можете победить, чтобы вернуться к своему собственному обработчику.

Самым простым решением было бы попытаться переместить как можно больше из этих функций из класса базовой страницы монстра в свои собственные классы - или, что еще лучше, в IHttpModules, где имеет смысл обрабатывать такие вещи, как истечение срока сессии - по порядку.отделить вещи.

...