前段时间简单的写了篇邮件内容生成的方案,地址:/sheepswallow/archive//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"的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"的Http管道"
HttpRuntime.ProcessRequest(swr);
}
return sb.ToString();
}
}
使用AspxCreator就成功或许到aspx解析后的内容了,但这样还有几个问题:
ApplicationHost.CreateApplicationHost这个方法的调用失败 中文会乱码子目录无效
写这篇的时候,电脑没有配置运行环境,所以没办法贴出一些效果图,所以上面几个问题我会在下篇再写,到时候增加些图片可能好点。
以前几乎没写过博客,在写博客方面是一个新人,发现写篇博客不容易,想写篇号博客更不容易,对博客园的大牛们致以最真诚的敬意,谢谢您们把泡妞的时间用来给我们这些新手留下宝贵的博客。
我现在打算遇到的难题或浪费很多时间解决的问题写下简单的解决过程,给其他后人作下参考,希望能坚持下去。
<script type="text/javascript"></script><script type="text/javascript" src="/pagead/show_ads.js"></script>