ASP.net和WCF对“覆盖”的一些澄清

时间:2010-04-01 12:23:28

标签: c# asp.net wcf

最近我遇到的面试问题很少。面试官要求给出详细的答案。

1)我们可以覆盖WCF服务(它不是OOPS覆盖)吗?。解释两端的原因。 (WCF相关)。

2)我们可以覆盖Page事件(Page_Load())吗?解释原因。(与ASP.NET相关)。

3)除了用户偏好之外,Pre_Init(页面)事件的主要职责是什么 设置,剥皮?

4)我们可以覆盖静态方法。解释原因。(C#相关)

任何人都可以帮我理解原因吗?

1 个答案:

答案 0 :(得分:3)

  1. 您无法真正覆盖WCF服务操作。如果您的服务合同类具有两个具有相同名称但不同参数的服务操作方法(即合法的C#重载),则WCF将在服务启动时抛出InvalidOperationException。如果您确实想这样做,可以更改OperationContract属性中某个方法的公开操作名称:

    [OperationContract(Name = "GetDataWithString")]
    public string GetData(string input)
    {
       ...
    }
    
    [OperationContract(Name = "GetDataWithNumber")]
    public string GetData(int input)
    {
       ...
    }
    
  2. 可以覆盖ASP.Net中的Page事件;这是非常广泛使用的,通常非常重要。您可以显式覆盖自定义页继承的Page类中的方法,也可以命名方法,使ASP.Net知道它们将被视为覆盖。例如,使用下面的签名在页面的代码隐藏中声明一个方法将自动覆盖Page_Init方法。

    void Page_Init(object sender, EventArgs e)
    
  3. Page_Init方法是ASP.Net开始跟踪ViewState的地方。这意味着对任何页面控件执行的任何操作现在都在ViewState StateBag中标记为Dirty,因此将进行base-64编码并在ViewState隐藏输入字段中向下发送到客户端,因此返回在回发上到服务器。在跟踪ViewState之前更改控件的值将有助于停止ViewState变得过大。有关详细信息,请参阅this seminal article

  4. 只有类实例方法可以标记为virtual,因为编译器创建的v-table附加到类实例。静态类成员不会附加到实例,而是附加到类本身,因此无法覆盖它们。 This article更详细地解释了这一点,并提供了一些解决方法。