asp.net VirtualPathProvider - очистка кэша с помощью проблемы GetCacheDependancy - PullRequest
3 голосов
/ 08 апреля 2011

Я использую VirtualPathProvider для возврата виртуальных страниц из таблицы SQL Server. Это рабочий пакет, и код в моем 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

Конечный класс

1 Ответ

0 голосов
/ 08 апреля 2011

Я думаю, вам нужно переопределить метод 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

где это поддельный метод IsVirtualPathForDatabase должен определить, связан ли виртуальный путь с вашей БД или нет.Если да, вы можете создать свой собственный CacheDependency для этого (я оставляю место для этого ...), в противном случае вы можете использовать Previous.GetCacheDependency для всех физических .aspx страниц.

...