Web表单和通用处理程序(ashx文件)可以共享一个共同的祖先类(或基页)吗?

时间:2010-10-06 17:32:32

标签: asp.net inheritance handler ashx

如果有一个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)。   要覆盖该实现,请添加   override关键字。否则加   新关键字。

2 个答案:

答案 0 :(得分:3)

如果将父类ProcessRequest设置为virtual,则可以在子类中覆盖它,并从重写方法内部调用基类方法。

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 :(得分:1)

您现在发现为什么OO大师类型总是投票给组合而不是继承。无论如何,完全按照你想要做的事情是非常棘手的,因为System.Web.UI.Page实现了IHttpHandler(如果我没记错的话),有许多内部处理你无法击败以回到自己的处理程序。

最简单的解决方法是尝试将怪物基页类中的所有这些函数移动到他们自己的类中 - 或者更好的是IHttpModules,它处理会话到期等事情是有意义的 - 以便解耦事物