• 检查缓存页的有效性


            当输出缓存中有一个它希望用作客户端请求响应的现有项时,它必须首先检查原服务器(或含有新响应的中间缓存,如代理服务器)以确定该缓存项是否仍可用。此过程称为验证缓存项。为避免因在缓存项有效的情况下重新生成和重新传输页,或在缓存项无效的情况下发生额外的往返进程而导致资源浪费,ASP.NET 为您提供了一种以编程方式验证缓存页的机制。

    注意   有关缓存有效性及其要求的更多信息,请参见位于 www.w3.orgor 的 HTTP 1.1 规范。

    若要确定缓存页是否有效,必须使用与 HttpCacheValidateHandler 委托相同的签名定义一个事件处理程序。该处理程序应执行检查以确定存储在缓存中的页是否仍有效,然后将 HttpValidationStatus 枚举值之一分配给检查的可能返回结果。该枚举具有以下三个值:

    • Invalid,该值表示缓存页无效,并且将从缓存中移除该页,而该请求将被作为缓存未命中处理。
    • IgnoreThisRequest,该值导致请求被作为缓存未命中处理,并且将执行该页,但该缓存页是无效的。
    • Valid,该值表示缓存页仍有效。

    在一个页生存期事件中,HttpCachePolicy.AddValidationCallback 方法将事件处理程序作为参数获取。从 Web 服务器缓存中输出响应服务之前,将查询已注册的所有处理程序以确保资源的有效性。如果任何处理程序设置了表示资源无效的标志,则该项将标记为无效并将从缓存中移除。然后,将请求作为缓存未命中来处理。

    检查缓存页的有效性

    1. 定义类型 HttpCacheValidateHandler 的事件处理程序,该事件处理程序用于检查缓存页响应的有效性。

      以下示例创建一个事件处理程序 Validate,用于检查 myText TextBox Web 服务器控件的 Text 属性值。根据文本框中输入的值,Validate 返回相应的 HttpValidationStatus 枚举值。

      [C#]
      public void Validate(HttpContext context, Object data, ref HttpValidationStatus status) 
      {
          if (myText.Text == "false") {
            status = HttpValidationStatus.Invalid;
          } else if (myText.Text == "ignore") {
            status = HttpValidationStatus.IgnoreThisRequest;
          } else {
            status = HttpValidationStatus.Valid;
          }
      }
      [Visual Basic]
      Public Sub Validate(context As HttpContext, data As [Object], ByRef status As HttpValidationStatus)
         If myText.Text = "false" Then
            status = HttpValidationStatus.Invalid
         Else
            If myText.Text = "ignore" Then
               status = HttpValidationStatus.IgnoreThisRequest
            Else
               status = HttpValidationStatus.Valid
            End If
         End If
      End Sub 'Validate
    2. 从一个页生存期事件中,调用 HttpCachePolicy.AddValidationCallback 方法,该操作将传递您在第 1 步的第一个参数变量中所定义的事件处理程序。

      在以下代码示例中,Page_Load 方法调用具有 Validate 事件处理程序(已在第 1 步的第一个参数变量中传递)的 AddValidationCallback

      [C#]
      public void Page_Load(){
          Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), null);
        }
      [Visual Basic]
      Public Sub Page_Load()
         Response.Cache.AddValidationCallback(New HttpCacheValidateHandler(Validate), Nothing)
      End Sub 'Page_Load

    以下示例将第 1 步中所定义的事件处理程序用于第 2 步中的代码并将时间戳写入页中。

    注意   该示例旨在简单地展示如何使缓存中的页无效。您创建的大多数方案都应该根据服务器上的某个状态(与更改的页关联)对页进行验证。
    [C#]
    <%@ OutputCache Duration=100 varybyparam="none" %>
    <Script Language="C#" runat="server">
    
      public void Page_Load(){
    
        if(!IsPostback) {
           myText.Text = "Enter validation request." ;
        }
    
        Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), null);
        stamp.InnerHtml = DateTime.Now.ToString("r");
      }
    
    public void Button1_Click(){  
       Validate();
    }  
    
    public void Validate(HttpContext context, Object data, ref HttpValidationStatus status) {
        if (myText.Text == "false") {
          status = HttpValidationStatus.Invalid;
        } else if (myText.Text == "ignore") {
          status = HttpValidationStatus.IgnoreThisRequest;
        } else {
          status = HttpValidationStatus.Valid;
        }
      }
    </Script>
    <form runat="server" >
    <asp:textbox id="myText" runat="server" />
    <br>
    <asp:button id="mybutton" click="Button1_Click" text="Click here to validate page." runat="server" />
    </form>
    <br>
    <b>In the text box, enter false to invalidate the cached page, ignore to ignore the current request, or any other string to leave the output cached page valid. </b>
    <br>
    <br>
    <Font size=6><B id=stamp runat=server /></Font>
    [Visual Basic]
    <%@ OutputCache Duration=100 varybyparam="none" %>
    <Script Language="VB" runat="server">
    
    Public Sub Page_Load()
       
       If Not IsPostback Then
          myText.Text = "Enter validation request."
       End If
       
       Response.Cache.AddValidationCallback(New HttpCacheValidateHandler(Validate), Nothing)
       stamp.InnerHtml = DateTime.Now.ToString("r")
    End Sub 'Page_Load
    
    Public Sub Button1_Click()
       
       Validate()
    End Sub 'Button1_Click
     
    Public Sub Validate(context As HttpContext, data As [Object], ByRef status As HttpValidationStatus)
       If myText.Text = "false" Then
          status = HttpValidationStatus.Invalid
       Else
          If myText.Text = "ignore" Then
             status = HttpValidationStatus.IgnoreThisRequest
          Else
             status = HttpValidationStatus.Valid
          End If
       End If
    End Sub 'Validate
    </Script>
    
    <form runat="server" >
    <asp:textbox id="myText" runat="server" />
    <br>
    <asp:button id="mybutton" click="Button1_Click" text="Click here to validate page." runat="server" />
    </form>
    <br>
    <b>In the text box, enter false to invalidate the cached page, ignore to ignore the current request, or any other string to leave the output cached page valid. </b>
    <br>
    <br>
    <Font size=6><B id=stamp runat=server /></Font>

  • 相关阅读:
    PKUSC2021游记
    P3349 [ZJOI2016]小星星
    序二
    1.3 解析库的安装
    1.2 请求库的安装
    1.5 存储库的安装
    1.6 Web 库的安装
    1.7 App 爬取相关库的安装
    2.1 HTTP 基本原理
    1.9 部署相关库的安装
  • 原文地址:https://www.cnblogs.com/zsxfbj/p/140658.html
Copyright © 2020-2023  润新知