0

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

这是一个旧代码示例:

示例 1:

无效页面加载(){
  ....一些代码
  如果(条件){
     /// 一些条件
  } 别的 {
     重定向页面(网址);
  }

  // 另一个代码块
  // 一些其他条件。
}
 

示例 2:

一种。文件1.ascx
无效页面加载(){
  尝试 {
    ..一些代码
    base.CheckPreference();
    重定向页面(默认页面);
  }
  捕捉(异常前){
    ExceptionHandling.GetErrorMessage(ex);
  }
}
湾。BaseClass.cs // 这是基类
无效检查偏好(){
  尝试 {
     如果(条件){
        重定向页面(url1);
     }否则如果(条件2){
        重定向页面(url2);
     } 别的 {
        // 更新会话
     }

  }
  捕捉(异常前){
     ExceptionHandling.GetErrorMessage(ex);
     扔;
  }
}

无效重定向页面(字符串网址){
  响应。重定向(网址);
}

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

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

// 更新代码 - MSDN 推荐。
无效重定向页面(网址){
  Response.Redirect(url, false);
  this.Context.ApplicationInstance.CompleteRequest();
  结束执行=真;
}

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

4

1 回答 1

3

对于发出重定向的人来说,最不直观的事情可能是,在我们看来,我们已经从我们称之为 Respond.Redirect 的方法中返回了(或者在您当时的语言/平台中的任何等效项。我们所做的只是调用一个方法。

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

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

return Redirect(url);

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

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

于 2010-11-19T18:32:17.523 回答