• 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 应用程序的虚拟应用程序根路径。

  • 相关阅读:
    windows计数器和瓶颈
    SQL Server 2005的Resource数据库
    Android学习笔记 json数据的解析
    android的消息处理机制(图+源码分析)——Looper,Handler,Message
    JS刷新验证码
    Java取得Unix的timestamp
    (转载)DBMS_SQL package 学习
    关于Java中Http下载的一些整理
    (转载)sqlserver内存释放
    关于EL表达式
  • 原文地址:https://www.cnblogs.com/frlmoney/p/3126936.html
Copyright © 2020-2023  润新知