ASP.NET通过URL读取HTML(后台读取前台HTML)

今天遇到一个问题,老总非要把之前遍历好的复选框显示出来的效果,附加到邮件中发送给客户。跟主管沟通后其意思就是在后台重新写个方法进行拼接字符串,再把内容输出到页面,一般用此方法挺靠谱,可是代码太多太烂看着我头都大了,实在不想去写字符串拼接的工作。开始想着是否有直接把输出的内容转换为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 Get HTML from a URL

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

http://www.rapidsnail.com/developer/topic/2007/105/3/46185/the-webclient-and-quot-try-to-be-automatic-redirection-of-too-many-times-and-quot-wrong.aspx

实在不想去拼接字符串,呜呜!今早上班来抱着试试看的态度,找到一篇文章,看着意思还是国内原创的,的确很靠谱,必须得支持。解决了一直困扰我的那个该死的:"尝试自动重定向的次数太多。"的问题,原文为:《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 应用程序的虚拟应用程序根路径。

原文地址:https://www.cnblogs.com/frlmoney/p/3126936.html