3

VirtualPathProviderSQL Server テーブルから仮想ページを返すために使用しています。これは pk で動作しており、VirtualPathProviderクラス ファイルのコードは以下のとおりです。

私が抱えている問題は、データベースに保持されている仮想ページ データ (タイトルまたはページ テキスト) を変更すると、元のページがキャッシュされているため、この変更が出力されたページに表示されないことです。

GetCacheDependancy を VirtualPathProvider クラスに追加することに関する記事をいくつか読み、いくつかの例を実装しようとしましたが、元のページがまだキャッシュされて表示されています。

また、仮想ページのページ読み込み ( Response.AddCacheItemDependency("Pages")) にコードを追加して、global.asax を編集してみました。

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs on application startup
        HttpContext.Current.Cache.Insert("Pages", DateTime.Now, Nothing, _
             System.DateTime.MaxValue, System.TimeSpan.Zero, _
             System.Web.Caching.CacheItemPriority.NotRemovable, _
             Nothing)

キャッシングを防止します。しかし、何も機能していません。

だから私が求めているのは、これらのキャッシングの問題を防ぐために、VirtualPathProvider クラス ファイルをいくつか変更することです。ご協力いただきありがとうございます。

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.Hosting
Imports System.Web.UI.MobileControls
Imports System.Collections.Generic

Public Class DbVirtualPathProvider
    Inherits VirtualPathProvider
    Public Shared Sub AppInitialize()
        Dim db As New DbVirtualPathProvider()
        HostingEnvironment.RegisterVirtualPathProvider(db)
    End Sub

Public Overrides Function FileExists(ByVal virtualPath As String) As Boolean
    Dim strConn As String = ConfigurationManager.ConnectionStrings("LIQUIDConnectionString").ConnectionString
    Dim cnn As New SqlConnection(strConn)
    cnn.Open()
    Dim cmd As New SqlCommand()
    cmd.Connection = cnn
    cmd.CommandText = "select count(*) from tbl_VirtualFiles where virtualpath='" & virtualPath & "'"
    Dim retval As Object = cmd.ExecuteScalar()
    cnn.Close()
    Dim i As Integer = Convert.ToInt32(retval)
    If i <= 0 Then
        'important as if no virtual file it looks for physical file
        Return Previous.FileExists(virtualPath)
    Else
        Return True
    End If
End Function

Public Overrides Function GetFile(ByVal virtualPath As String) As VirtualFile
    Dim file As New DbVirtualFile(virtualPath)
    If file.WebFormContent Is Nothing Then
        Return Previous.GetFile(virtualPath)
    Else
        Return file
    End If
End Function

End Class
4

1 に答える 1

0

VirtualPathProvider.GetCacheDependencyメソッドの場合と同じように、仮想パスプロバイダーのメソッドをオーバーライドする必要があるFileExistsと思いますGetFile。したがって、たとえば次のように実行できます。

Public Overrides Function GetCacheDependency(virtualPath As String, virtualPathDependencies As IEnumerable, utcStart As DateTime) As CacheDependency
    If IsVirtualPathForDatabase(virtualPath) Then
        Return New CacheDependency(...)
    Else
        Return New Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart)
    End If
End Function

where is fakeIsVirtualPathForDatabaseメソッドは、仮想パスがデータベースに関連しているかどうかを判断する必要があります。もしそうなら、あなたはこれのためにあなた自身CacheDependencyを作成することができます(私はそれのための場所を残します)、それ以外の場合はすべての物理ページに...使用できます.Previous.GetCacheDependency.aspx

于 2011-04-08T12:49:46.940 に答える