【问题标题】:How do i improve the legacy code implementation, Response.Redirect?如何改进遗留代码实现,Response.Redirect?
【发布时间】:2010-11-19 18:14:03
【问题描述】:

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

这是一个旧代码示例:

示例 1:

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

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

示例 2:

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

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

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

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

我们必须更新 RedirectPage 代码见下面的代码 sn-p:

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

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

【问题讨论】:

  • 您遇到了什么问题?通过将false 传递给redirect 方法,然后调用CompleteRequest(),这应该会结束请求。
  • 遗留代码中发生了什么?错误是什么
  • 在旧代码中,由于 RedirectPage 引发 ThreadAbortException,因此不会调用 RedirectPage 之后的代码块。但是,如果我实现 MSDN 的建议,那么 RedirectPage 之后的代码将被执行,我不想执行它。由于这是遗留代码,在许多地方,在 RedirectPage 之后有很多代码,例如进行服务调用、更新会话等...所以我正在寻找替代方法。

标签: asp.net response.redirect


【解决方案1】:

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

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

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

return Redirect(url);

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

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

【讨论】:

  • 嗨,您是说传统方法完全合理吗?
  • 在执行重定向后立即从该方法返回是完全合理的。您要小心不要意外执行您不应该执行的代码。只要意图非常明确,并且代码是可维护的,就不要因为有人构想出新的“最佳实践”而对其进行更改。更改某些内容,因为它已损坏或组合方式不清楚。
猜你喜欢
  • 2011-03-13
  • 2010-11-18
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2011-06-11
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多