gpt4 book ai didi

c# - 从 DLL 动态加载 ASP.NET 页面

转载 作者:太空宇宙 更新时间:2023-11-03 13:34:22 25 4
gpt4 key购买 nike

我想创建一个模块化的 ASP.NET 应用程序。比如,我有一个主应用程序,它只是某种模块加载器。它只有一个“Default.aspx”页面。并且,基于加载的模块,此页面将创建一个菜单和指向模块中找到的页面的链接。

我希望模块是打包到 dll 中的 ASP.NET 项目。所以,我想将该 dll 放入我的主应用程序的“模块”文件夹中,它将识别模块,并使用反射加载模块,检查它们以找到页面,并从中构建一个菜单。

到目前为止我做了什么:

在我的解决方案中,我有一个“DummyModule”项目。这个项目只有 3 页。没什么特别的。

我还有另一个名为“MainApp”的项目。这是“大事”。

在这个项目中,我有一个“ModuleLoader”类。当调用“LoadModules”方法时,它会在我的应用程序的“Modules”文件夹中搜索“dll”文件。并且,使用反射加载这些模块。对于这些模块中的每一个,仍然使用反射,它搜索所有“页面”类型,并将名称存储到列表中。

在“Default.aspx”页面的“Page_Load”方法中,它调用“ModuleLoader”类,获取所有模块名称和每个模块的所有页面名称,并从中构建一个菜单。我创建了一个超链接模式,其中包含加载正确页面所需的所有信息。即:“/ModuleName/PageName”。我没有使用“aspx”扩展名。好的,到目前为止,一切顺利。

这是棘手的部分。

我创建了一个名为“PageLoaderModule”的 HTTPModule。此模块拦截所有请求,因此我可以读取 URL 以识别我必须加载的模块中的哪个页面。

这正是我不能做的,我不知道如何解决这个问题。

我在做什么:

public class PageLoaderModule : IHttpModule
{
#region IHttpModule Members

public void Dispose()
{
//clean-up code here.
}

public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}

private void context_BeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication)sender;

if (Regex.IsMatch(application.Request.RawUrl, @"/.+/.+"))
{
var parts = application.Request.RawUrl.Split('/').Where(u => !string.IsNullOrWhiteSpace(u)).ToList();

IHttpHandler page = ModuleManager.GetPage(parts[0], parts[1]);

page.ProcessRequest(application.Context);
}
}

#endregion IHttpModule Members
}

“GetPage”方法,在指定程序集中找到正确的“Page”类型,创建实例并返回该Page实例。

但是当我调用 IHTTPHandler 接口(interface)的“ProcessRequest”方法时,它不会加载页面。

这有可能吗?有什么想法吗?

编辑:

我试过@Slavo 的建议。

在搜索答案时,我发现并尝试了类似的解决方案,实现了我自己的 VirtualPathProvider 和 VirtualFile。它几乎奏效了。虚拟路径处理并加载正确的页面,但是当加载页面时,我在浏览器中收到以下错误:

Parser Error Message: Could not load type 'DummyModule.Pages.DummyPage3'.
Source Error:
Line 1: <% @ Page Language="C#" AutoEventWireup="true" CodeBehind="DummyPage3.aspx.cs" Inherits="DummyModule.Pages.DummyPage3" %>

所以,我不知道是我做错了什么,还是这不是我正在寻找的解决方案。所以,我尝试了其他选择。

我正确地将“.aspx”文件的“Build Action”标记为“Embedded Resource”,因此它可以作为虚拟路径访问。但是还是出现上面的错误。

最佳答案

这看起来像是您想要编写 VirtualPathProvider 的情况。此类允许您控制为编译系统提供组件的逻辑。

当 ASP.NET 编译页面来处理请求时,默认情况下它只使用 ASPX 文件和代码隐藏。如果您编写自定义 VirtualPathProvider,您将能够告诉它不这样做。因此,每当 ASP.NET 需要为特定路径编译页面以处理请求时,您的提供者都可以从程序集中提取它。

这是一篇有用的文章:http://support.microsoft.com/kb/910441

关于c# - 从 DLL 动态加载 ASP.NET 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com