iis ASP.NET自定义目录浏览处理程序

azpvetkf  于 2023-10-19  发布在  .NET
关注(0)|答案(2)|浏览(165)

我有一个运行在IIS Express上的WebForms应用程序。
我使用directoryBrowse=enabled来让用户访问文件结构的一部分,以便下载和打开文件。当我访问网站上的公共目录时,会像往常一样显示一个标准的IIS目录列表页面,其中包含目录内容。
我想注册一个自定义处理程序,专门用于目录浏览,以控制浏览目录时显示的内容和方式。我知道如何为特定的文件或文件类型注册一个处理程序,但是我不知道如何为一个目录注册一个处理程序(理想情况下,全局任何目录都是同一个处理程序)。

2ekbmq32

2ekbmq321#

那么,关闭文件夹浏览,然后说提供基于Web的自己的UI不是更好吗?
我注意到上面的内容,因为这个VAST提高了安全性,允许无限制地定制UI。并说将允许限制文件夹和文件的基础上,用户的登录。
更好的是,您还可以使用其他文件夹然后服务器,但不必创建和Map虚拟文件夹从Web服务器到其他服务器。
这意味着,对于其他文件夹等,您不必更改Web服务器配置。
假设你把一个树视图控件放到网页上。
选择图像设置为“windows xp文件浏览”。

所以,现在我们有了这个标记:

<asp:TreeView ID="TreeView1" runat="server" ImageSet="XPFileExplorer"
    NodeIndent="15" OnTreeNodeExpanded="TreeView1_TreeNodeExpanded1">
    <HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" />
    <NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black"
        HorizontalPadding="2px" NodeSpacing="0px" VerticalPadding="2px" />
    <ParentNodeStyle Font-Bold="False" />
    <SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False"
        HorizontalPadding="0px" VerticalPadding="0px" />
</asp:TreeView>

因此,“浏览”文件夹的代码并不多,但您当然可以引入对文件类型的限制,并根据用户的登录设置文件夹(限制)。所以,说这段代码:(它甚至不是递归的,也不需要递归)。

Dim sRoot As String = "c:\SERVER01"

Public Class MyFolder
    Public MyFiles As FileInfo()
    Public MyFolders As DirectoryInfo()
End Class

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        lblFolder.Text = sRoot
        Dim MyFiles As MyFolder = GetFiles(sRoot)
        LoadTreeFiles(sRoot, MyFiles, "", Nothing)
    End If

End Sub

Public Function GetFiles(sRootFolder As String) As MyFolder

    Dim MyDir As New DirectoryInfo(sRootFolder)
    Dim cMyFolder As New MyFolder

    cMyFolder.MyFolders = MyDir.GetDirectories("*.*", SearchOption.TopDirectoryOnly)
    cMyFolder.MyFiles = MyDir.GetFiles("*.*", SearchOption.TopDirectoryOnly)

    Return cMyFolder

End Function

Sub LoadTreeFiles(fRootL As String,
                  lParent As MyFolder,
                  sParentID As String,
                  tTreeNode As TreeNode)

    ' add folders if any
    For Each sFolder As DirectoryInfo In lParent.MyFolders
        Dim child As New TreeNode
        child.Text = sFolder.Name
        child.Value = sFolder.FullName
        child.Expanded = False
        child.PopulateOnDemand = True
        child.ShowCheckBox = False

        If sParentID = "" Then
            TreeView1.Nodes.Add(child)
        Else
            tTreeNode.ChildNodes.Add(child)
        End If
    Next
    ' now any files
    For Each sFile As FileInfo In lParent.MyFiles

        Dim child As New TreeNode
        child.Text = sFile.Name
        child.Value = sFile.FullName
        child.Expanded = False
        child.ShowCheckBox = True
        child.PopulateOnDemand = False

        If sParentID = "" Then
            TreeView1.Nodes.Add(child)
        Else
            tTreeNode.ChildNodes.Add(child)
        End If
    Next

End Sub

Protected Sub TreeView1_TreeNodeExpanded1(sender As Object, e As TreeNodeEventArgs) Handles TreeView1.TreeNodeExpanded

    Dim child As TreeNode = e.Node
    Dim dtChild As MyFolder = GetFiles(child.Value)

    LoadTreeFiles(child.Value, dtChild, child.Text, child)

End Sub

现在网页显示:

所以,还不清楚你是否需要/想要一个自定义处理程序,但只需要用树视图控件构建某种UI,并按照上面的方法构建自己的文件浏览系统。由于我只加载每个文件夹“按需”,那么上面的速度是非常快的,即使是一个系统与一个大而深的文件夹层次结构。
上面有多个文件选择的复选框,但你可以点击一个文件下载。上面的设计允许你添加额外的UI选项,比如“选择所有这个文件夹”或者其他什么。

x9ybnkn6

x9ybnkn62#

我自己找到了答案。对于任何有类似问题的发现者发布。

原来可以为路径*/注册一个handler:

<add name="directory-handler" type="DirectoryHandler" path="*/" verb="*"/>

然后,服务器将对任何以“/”结尾的请求使用此处理程序,除了通过WeblogyUrls或有效配置的路由的现有页面,这意味着它将对服务器文件树中的任何目录使用此处理程序。然后创建一个名为DirectoryDirectory的新IHttpRequest:

public class DirectoryHandler : IHttpHandler
{
    public const string DirectoryBrowserPage = "/Browse/";
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Redirect(DirectoryBrowserPage + context.Request.Path);
    }
}

这会将指向某个目录的请求重定向到mypage.com/Browse/[Request.Path]然后,我在RouteConfig.cs中注册了一个新路由:

public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            //Conflicting routes must be defined before friendlyurls are 
            routes.Add("Browse", new Route("Browse/{*path}", new GenericRouteHandler("~/Browse.aspx")));

            var settings = new FriendlyUrlSettings();
            settings.AutoRedirectMode = RedirectMode.Permanent;
            routes.EnableFriendlyUrls(settings);
        }
    }

实施GenericRouteHandler

public class GenericRouteHandler : IRouteHandler
{

    public GenericRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
        foreach (var urlParm in requestContext.RouteData.Values)
        {
            requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;
        }
        return page;
    }

}

最后,我创建了Browse页面本身,在这里我可以通过以下方式访问请求的目录路径:

string path = HttpContext.Current.Items["path"] as string;

剩下的就是在Browse页面中手动创建视图、权限和行为。

相关问题