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

标签 c# asp.net .net reflection dll

我想创建一个模块化的 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/

相关文章:

c# - 为什么不能将两个泛型类型与 '==' 进行比较?

c# - 如何将字符串的长度限制为 150 个字符?

c# - linq 和字符串数组

asp.net - 如何使 ASP.NET TextBox 在 AJAX UpdatePanel 中触发 onTextChanged 事件?

c# - 如何以编程方式获取计算机的本地网络 IP 地址?

javascript - 如何将字符串数组的 JavaScript 数组转换为 C# 数据结构?

c# - ASP.NET MVC4 Ajax ActionLink 帮助程序不起作用 - 使用返回的局部 View 重新加载整个页面

c# - web farm环境开发注意事项

c# - 区分HttpClient请求失败类型

.net - 明确的控制措施不会将其处置-有什么风险?