前段时间简单的写了篇邮件内容生成的方案,地址:http://www.cnblogs.com/sheepswallow/archive/2013/05/12/3073911.html
在该文章里提到了5种方法,其中提到第5点——自己写一个解析aspx的解析类,是最困难的。我这个人有个不知道是优点还是缺点的习惯,就是专挑难的做,于是我查了.net4.0的源码,发现要解析aspx文件,需要一个实现了HttpWorkerRequest这个抽象类的子类。完整的实现全部抽象方法似乎困难挺大的,所以我使用了微软提供的一个已经简单实现的类——SimpleWorkerRequest。
从文档上理解,我写出了以下的代码:
public string GetPageContent()
{
StringBuilder sb = new StringBuilder();
using (System.IO.StringWriter sw = new StringWriter(sb))
{
SimpleWorkerRequest swr = new SimpleWorkerRequest("/", Environment.CurrentDirectory, "text.aspx", "", sw);
//对HttpRuntime这个类的理解可以去Google"asp.net的Http管道"
HttpRuntime.ProcessRequest(swr);
}
return sb.ToString();
}
这段代码可以运行成功,但返回来的数据却不是aspx解析成功之后的HTML,而已一些异常信息,具体的异常信息我不贴了。
在Google里查了n多文档,看着恶心的英语文章,看到想吐后,我发现很多都要使用一个MarshalByRefObject类的子类,是不是需要不能直接解析一个aspx页面,而是需要象网站那样建立一个目录,建立一个应用程序域来监视该目录,才能解析aspx文件呢?理论知识不足,希望哪位看了这篇文章的大牛能解答下。
参考网上的资料,我写下了以下代码:
public class AspxCreator : MarshalByRefObject
{
/// <summary>
/// 创建
/// </summary>
/// <param name="appPath">需要解析的页面的根目录,在网站项目中使用时,不能和网站同一个目录,但可以是网站的子目录</param>
/// <returns></returns>
public static AspxCreator Create(string appPath)
{
return (AspxCreator)ApplicationHost.CreateApplicationHost(typeof(AspxCreator), "/", appPath);
}
public string GetPageContent(string page, string query)
{
StringBuilder sb = new StringBuilder();
using (System.IO.StringWriter sw = new StringWriter(sb))
{
SimpleWorkerRequest swr = new SimpleWorkerRequest(page, query, sw);
//对HttpRuntime这个类的理解可以去Google"asp.net的Http管道"
HttpRuntime.ProcessRequest(swr);
}
return sb.ToString();
}
}
使用AspxCreator就成功或许到aspx解析后的内容了,但这样还有几个问题:
写这篇的时候,电脑没有配置运行环境,所以没办法贴出一些效果图,所以上面几个问题我会在下篇再写,到时候增加些图片可能好点。
以前几乎没写过博客,在写博客方面是一个新人,发现写篇博客不容易,想写篇号博客更不容易,对博客园的大牛们致以最真诚的敬意,谢谢您们把泡妞的时间用来给我们这些新手留下宝贵的博客。