【问题标题】:How do I determine if a request is the result of a postback?如何确定请求是否是回发的结果?
【发布时间】:2010-08-05 17:14:30
【问题描述】:

更新

我正在实现一个自定义页面缓存解决方案,如果请求是为了响应表单提交或某种 asp.net 回发,我不希望该请求被缓存或从缓存中检索。

我试图弄清楚当前的 HttpRequest 是否是回发。有没有办法在页面或其他用户控件的上下文之外执行此操作?换句话说,如果我在 HttpModule 中,我无法访问 this.IsPostBack,但我仍然需要确定它是否实际上是回发。

此外,回发总是“发布”请求还是由包含表单确定?

谢谢!

【问题讨论】:

  • 能否请您详细说明“在页面或其他用户控件的上下文之外”?
  • 没有 ASP.NET 页面就无法进行回发。否则,您所拥有的只是一个常规的 HTTP POST。
  • IsPostBack 对您来说究竟意味着什么?比如,只有当数据被传递给模块时......还是什么?

标签: asp.net


【解决方案1】:

检查HttpWebRequestMethod 属性。回传应在Method 中标记为POST

此外,您在老式 ASP 中执行此操作的方式是检查 HTTP 消息正文中的预期回发参数 (Request.Form)。您可以检查看起来像回发参数的数据的请求内容。我不确定你到底在使用什么对象,但如果它是一个HttpWebRequest,你可以从对象的GetResponseStream() 方法检查请求流。

【讨论】:

  • 对于较小的发起者:if (context.Request.HttpMethod != "POST")
【解决方案2】:
if (Request.ServerVariables["REQUEST_METHOD"] == "POST") {
    // This is a POST
}

【讨论】:

  • Ben McCormack 有一个更好的答案,但基本上是一样的。
【解决方案3】:

下面的静态例程应该能够确定当前请求是否是回发。但是,它仅在您执行 ASPX 页面或其衍生页面时才有效。

public class PostBackUtility
{
    public static Boolean IsPagePostBack
    {
        get 
        {
            Page pageHandler = HttpContext.Current.CurrentHandler as Page;
            if (pageHandler == null) return false;
            return pageHandler.IsPostBack;
        }
    }
}

还应注意,CurrentHandler 可能尚未初始化,具体取决于您尝试评估 IsPagePostBack 的请求生命周期的哪个阶段。我相信这种方法只会在HttpApplication.PostMapRequestHandlerHttpApplication.ReleaseRequestState之间有效。

【讨论】:

    【解决方案4】:

    HTTPHandler 将有权访问当前的 HTTPContext。您使用它来检查一些属性(Request.RequestType、Request.URLReferrer)并手动确定它是否是 PostBack。

    【讨论】:

      【解决方案5】:

      可以获取到当前页面的引用:Get current System.Web.UI.Page from HttpContext?

      然后您可以检查 Page.IsPostBack 属性。

      【讨论】:

      • 这是一个很好的发现,我正在投票,但它仍然对我不起作用,因为我在处理程序与请求相关联之前进入管道,因此 HttpContext.Current.Handler始终为空。
      • 页面渲染的哪一步需要知道页面是否回发?
      【解决方案6】:

      像@ThatSteveGuy 的回答一样,HTTPHandler 将有权访问当前页面,您可以检查请求类型。

      注意 HTTPHandler 上下文仅在 Global.asax.cs 中的 Application_PreRequestHandlerExecute 中可用。以下是您可以在 Global.asax.cs 中使用的代码示例。

          void Application_PreRequestHandlerExecute(object sender, EventArgs e)
          {
              if (HttpContext.Current.Request.RequestType.Equals("POST"))
              {
                  //Your code can go here.
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2020-11-17
        • 2019-07-20
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        • 2011-01-07
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多