我可以运行 ASPX 并 grep 结果而不发出 HTTP 请求吗?

2023-12-02

如何在没有 URL 和 HTTP 的情况下对一个简单的 ASP.NET 文件进行函数调用,并捕获它生成的字节流?

更多背景信息,

我需要某种模板可以在里面放入一些逻辑,以呈现一些像文本文件一样的 INI。我放弃了那些从Java移植的库,并提出了使用ASP.NET作为模板引擎的解决方案。 (我不是用它来构建网站,甚至不是 HTML。)

我编写了一个 ASP.NET 页面(没有 WebForm,没有 MVC),它接受 XML POST,并根据一组简单但不太简单的规则生成一个长文本文件。

我从 DB 对象生成 XML,提交到 ASP 页面,grep 结果,效果非常好。然而,问题是我们想要用作库,由 WCF 使用。因此,我无法使用相对路径,并且必须将 ASP 的 URL 存储在配置中的某个位置,但我不想这样做。

它将托管在 IIS 服务器上,但不会从任何前端 ASP 调用(至少不是直接调用),并且永远不会从最终用户调用。

附言。我最初是在寻找一个简单的 C# 模板引擎,但是they太旧了,不再维护,文档很差,缺少集成编辑器/调试器,太简单,而且它们可能会说不同的语言。

聚苯硫醚。我也考虑过 T4,但它在 VS 2008 中没有编辑器或调试器。


如果您为 ASPNET 运行时构建主机,则可以在没有 IIS、没有 HTTP 消息的情况下运行 ASPX 页面。

例子:

public class MyAspNetHost : System.MarshalByRefObject
{
    public void ProcessRequest(string page)
    {
        var request = new System.Web.Hosting.SimpleWorkerRequest
            (page,               // the page being requested
             null,               // query - none in this case
             System.Console.Out  // output - any TextWriter will do
            );

        // this will emit the page output to Console.Out
        System.Web.HttpRuntime.ProcessRequest(request);
    }

    public AppDomain GetAppDomain()
    {
        return System.Threading.Thread.GetDomain();
    }
}


public class Example
{   
    public void Run(IEnumerable<String> pages)
    {
        // ASPNET looks for assemblies - including the assembbly
        // that contains any custom ASPNET host - in the bin\
        // subdirectory of the physical directory that backs the
        // ASPNET Host.  Because we are going to use the current
        // working directory as the physical backing directory for
        // the ASPNET host, we need to ensure there's a bin
        // subdirectory present.

        bool cleanBin = false;
        if (!Directory.Exists("bin"))
        {
            cleanBin = true;
            Directory.CreateDirectory("bin");
        }

        // Now, ensure that the assembly containing the custom host is
        // present in that bin directory.  The assembly containing the
        // custom host is actually *this* assembly.  

        var a = System.Reflection.Assembly.GetExecutingAssembly();
        string destfile= Path.Combine("bin", Path.GetFileName(a.Location));
        File.Copy(a.Location, destfile, true); 

        host =
            (MyAspNetHost) System.Web.Hosting.ApplicationHost.CreateApplicationHost
            ( typeof(MyAspNetHost),
              "/foo",   // virtual dir - can be anything
              System.IO.Directory.GetCurrentDirectory() // physical dir
              );

        // process each page
        foreach (string page in pages)
            host.ProcessRequest(page);
    }
}

如果你想清理 bin 目录,你必须先卸载 AppDomain。你可以这样做,像这样:

    private ManualResetEvent aspNetHostIsUnloaded;

    private void HostedDomainHasBeenUnloaded(object source, System.EventArgs e)
    {
        // cannot clean bin dir here.  The AppDomain is not yet gone.
        aspNetHostIsUnloaded.Set();
    }

    private Run(IEnumerable<String> pages)
    {
        try 
        {
            ....code from above ....
        }
        finally
        {
            if (host!= null)
            {
                aspNetHostIsUnloaded = new ManualResetEvent(false);

                host.GetAppDomain().DomainUnload += this.HostedDomainHasBeenUnloaded;

                AppDomain.Unload(host.GetAppDomain());

                // wait for it to unload
                aspNetHostIsUnloaded.WaitOne();

                // optionally remove the bin directory
                if (cleanBin)
                {
                    Directory.Delete("bin", true);
                }

                aspNetHostIsUnloaded.Close();
            }
        }
    }

这对于测试 ASPX 页面之类的事情很有意义。但我不太确定这对于您的情况是否正确。有更直接的方法来生成文本文件。但是,它可能适合您。如果您确实喜欢模板引擎的想法,托管 ASPNET 可能正适合您。

在您的情况下,您可能需要修改自定义主机,以便每个页面的输出都转到字符串编写器而不是 Console.Out,然后你可以执行 Grep (或更可能使用以下命令进行搜索)Regex)在该输出上。您可能还想修改它以接受所有输入数据作为查询字符串。您需要格式化页面请求才能执行此操作。

EDIT: 有MSDN 杂志上有一篇关于托管 ASPNET 运行时技术的好文章。从2004年12月开始。


EDIT2:有一种更简单的方法来管理 bin 目录。只需创建一个名为 bin 的符号链接,指向“.”。然后,您可以在调用 AppDomain.Unload() 后删除符号链接,而无需等待。看起来像这样:

    public void Run(string[] pages)
    {
        bool cleanBin = false;
        MyAspNetHost host = null;
        try
        {
            // This creates a symlink.
            // ASPNET always looks for a bin\ directory for the privateBinPath of the AppDomain.
            // This will create the bin dir, pointing to the current dir.
            if (!Directory.Exists("bin"))
            {
                cleanBin = true;
                CreateSymbolicLink("bin", ".", 1);
            }

            host =
                (MyAspNetHost) System.Web.Hosting.ApplicationHost.CreateApplicationHost
                ( typeof(MyAspNetHost),
                  "/foo",   // virtual dir - can be anything
                  System.IO.Directory.GetCurrentDirectory() // physical dir
                  );

            foreach (string page in pages)
                host.ProcessRequest(page);
        }
        finally
        {
            // tell the host to unload
            if (host!= null)
            {
                AppDomain.Unload(host.GetAppDomain());

                if (cleanBin)
                {
                    // remove symlink - can do without waiting for AppDomain unload
                    Directory.Delete("bin");
                }
            }
        }
    } 

这消除了对 ManualResetEvent、复制文件、同步等的需要。它假定自定义 ASPNet Host 的程序集以及您运行的 ASPX 页面所需的所有程序集都包含在当前工作目录中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以运行 ASPX 并 grep 结果而不发出 HTTP 请求吗? 的相关文章

  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐