我如何改进遗留代码实现,Response.Redirect?

时间:2010-11-19 18:14:04

标签: asp.net response.redirect

需要思考的一些场景。遗留代码具有以下实现示例1和示例2。如果我们尝试实现MSDN recommendation,那么遗留代码就会失败。

以下是旧版代码示例:

示例1:

void Page_Load() {
  .... some code
  if(condition) {
     /// some condition
  } else {
     RedirectPage(url);
  }

  // another code block
  // some other conditions. 
}
 

示例2:

a. File1.ascx
void Page_Load() {
  try {
    .. some code
    base.CheckPreference();
    RedirectPage(defaultPage);
  }
  catch(Exception ex) {
    ExceptionHandling.GetErrorMessage(ex);
  }
}
b. BaseClass.cs  // this is the base class 
void CheckPreference() {
  try {
     if(condition) {
        RedirectPage(url1);
     } else if(condition2) {
        RedirectPage(url2);
     } else {
        // update session
     }

  }
  catch(Exception ex) {
     ExceptionHandling.GetErrorMessage(ex);
     throw;
  }
}

void RedirectPage(string url) {
  Response.Redirect(url);
}

一种可能的方法是在类中添加一个布尔字段,例如endExecution,每当调用RedirectPage时将字段设置为true。

我们必须更新RedirectPage代码,请参阅下面的代码段:

// Updated code - MSDN recommendation.
void RedirectPage(url) {
  Response.Redirect(url, false);
  this.Context.ApplicationInstance.CompleteRequest();
  endExecution = true;
}

请提供一些其他更好的方法来改进遗留代码实现。

1 个答案:

答案 0 :(得分:3)

对于发布重定向的人来说,最不直观的事情可能是,在我们看来,我们已经从方法返回了我们称之为Respond.Redirect(或者当天在您的语言/平台中使用的等价物。我们所有的'完成的是调用方法。

底线是您必须停止处理请求以避免尝试提交同一请求的响应。这会在我使用的任何平台上引发异常。

ASP.NET MVC使用ActionResponse对此进行了改进,以便您从该方法返回(并终止请求处理的其余部分),其代码如下所示:

return Redirect(url);

最重要的是,您需要养成在执行重定向后立即从事件中返回的习惯。任何偏离这种习惯的行为都需要记录在代码中。这将有助于使应用程序以您期望的方式执行。

你采取的方法是完全合理的。