asp.net VirtualPathProvider - больше не распознает физические файлы - PullRequest
0 голосов
/ 07 апреля 2011

Я использую VirtualPathProvider для возврата виртуальных страниц из таблицы базы данных, и все работает нормально, но проблема в том, что сайт больше не распознает, когда страница существует физически, а не удерживается в таблице виртуальных страниц.

Код, который я использую, находится ниже при загрузке страницы при отладке физической страницы, когда функция FileExists возвращает false, при загрузке страницы происходит сбой и «ресурс не найден».

любые советы, как решить эту проблему, будут великолепны! спасибо

    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

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("connstr").ConnectionString
        Dim cnn As New SqlConnection(strConn)
        cnn.Open()
        Dim cmd As New SqlCommand()
        cmd.Connection = cnn
        cmd.CommandText = "select count(*) from webforms where virtualpath='" & virtualPath & "'"
        Dim retval As Object = cmd.ExecuteScalar()
        cnn.Close()
        Dim i As Integer = Convert.ToInt32(retval)
        If i <= 0 Then
            Return False
        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

1 Ответ

2 голосов
/ 07 апреля 2011

Взгляните на VirtualPathProvider.Previous собственность.MSDN сообщает, что свойство Previous получает ссылку на ранее зарегистрированный объект VirtualPathProvider в системе компиляции.

Поэтому вам следует немного изменить свой метод FileExists, например:

Dim i As Integer = Convert.ToInt32(retval)
If i <= 0 Then
    Return Previous.FileExists(virtualPath)
Else
    Return True
End If

GetFileметод не должен быть изменен, потому что вы уже используете Previous.GetFile(virtualPath).

...