今天遇到一个问题,老总非要把之前遍历好的复选框显示出来的效果,附加到邮件中发送给客户。跟主管沟通后其意思就是在后台重新写个方法进行拼接字符串,再把内容输出到页面,一般用此方法挺靠谱,可是代码太多太烂看着我头都大了,实在不想去写字符串拼接的工作。开始想着是否有直接把输出的内容转换为img然后输出。最后也没找到什么资料,有一篇看着挺靠谱不过是HTML5的,所以没有深入研究。因此就想有没有什么办法能直接把前台生成好的HTML代码读取过来直接输出在邮件内容中,功夫不负有心人,Google根据关键字“asp.net get html”搜索到一片题目为:"How To Read Web Page HTML Code With ASP.NET?"(如何用ASP.NET读取网页HTML代码?)的文章,其给了我灵感。既然都能到获取HTML那其余的工作就迎刃而解了!
由于时间关系如下2篇文章感觉挺靠谱,所以没多去看,有兴趣的朋友可以去看看。。。毕竟实现方法和思路是不一样的!
How to Read the HTML of a Web Page Programmatically
下边贴出HTML代码以及后台代码:
<form id="form1" runat="server"> 网址:<br /> <asp:TextBox ID="txtURL" runat="server"></asp:TextBox> <asp:Button ID="btnGetHTML" runat="server" Text="获取页面HTML" OnClick="btnGetHTML_Click" /> <br /> 页面HTML代码:<br /> <asp:TextBox ID="txtPageHTML" runat="server" Height="186px" TextMode="MultiLine" Width="263px"></asp:TextBox> </form>
protected void btnGetHTML_Click(object sender, EventArgs e) { // 使用WebClient类进行页面HTML的读取 WebClient MyWebClient = new WebClient(); // 读取网页HTML变为byte数组。 Byte[] PageHTMLBytes; if (txtURL.Text != "") { PageHTMLBytes = MyWebClient.GetData(txtURL.Text);
// 如果程序是Web应用程序,则需将GetData方法(引用using Maticsoft.Common;命名空间)
// 变更为DownloadData方法(引用using System.Text;命名空间)。 // 转换byte数组结果为一个字符串 UTF8Encoding oUTF8 = new UTF8Encoding(); txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes); } }
遇到纠结的地方了,直接引用站内地址的时候就发生错误:"尝试自动重定向的次数太多。(too many automatic redirections were attempted.)"暂时还没有找到什么好的解决方案。
例如如果输入Google的地址将不会出现什么问题,可是在www.wnweixiu.com域名下根据www.wnweixiu.com/GetHTML.aspx来进行读取HTML则将发生上述错误。
看到很多帖子有相关的介绍,可是实验之后没一个靠谱的,然后找老外的资料,发现那些乱贴出来的帖子,居然又都是老外的东西。
如下贴出2个老外的地址,有兴趣的可以拜读下,反正我至今未找到一个能解决的方案。难不成此方案要流产了,天啊,我可不想回去拼接字符串。
http://www.opendebug.com/article/422435
实在不想去拼接字符串,呜呜!今早上班来抱着试试看的态度,找到一篇文章,看着意思还是国内原创的,的确很靠谱,必须得支持。解决了一直困扰我的那个该死的:"尝试自动重定向的次数太多。"的问题,原文为:《Too many automatic redirections were attempted 的解决方法》,大家一定得拜读拜读,不过我需要的是返回String类型的数据,他的代码只是给个流,因此还得将流转换为字符串,不过此种方案放弃了使用WebClient类进行操作,改用HttpWebRequest类,如下贴出经过测试并优化后的代码,供大家学习:
/// <summary> /// 通过URI读取指向地址的HTML代码 /// </summary> /// <param name="url">URI地址(例如:http://www.wnweixiu.com)</param> /// <returns></returns> protected string GetHTMLCode(string url) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); //使用Cookie设置AllowAutoRedirect属性为false,是解决“尝试自动重定向的次数太多。”的核心 request.CookieContainer = new CookieContainer(); request.AllowAutoRedirect = false; WebResponse response = (WebResponse)request.GetResponse(); Stream sm = response.GetResponseStream(); System.IO.StreamReader streamReader = new System.IO.StreamReader(sm); //将流转换为字符串 string html = streamReader.ReadToEnd(); streamReader.Close(); return html; }
在说一个小技巧,主要是用来获取网站域名(如http://www.wnweixiu.com),如果本机测试那就是http://localhost+端口号的形式(如http://localhost:409).
之前还总傻到使用Request.Url然后在进行复杂的字符串拼接截取操作,居然都没发现该属性下有个很靠谱的GetLeftPart方法,Request.Url.GetLeftPart(UriPartial.Authority)这样就可以 获取到域名了。
System.IO.Path.GetFileName(Request.PhysicalPath);则可以获取页面名称。
Request.ApplicationPath:获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径。