【问题标题】:Current Page HTML output using c#使用 c# 的当前页面 HTML 输出
【发布时间】:2012-07-18 08:40:02
【问题描述】:

我在一个 asp.net 网站上工作。我需要在页面加载事件中获取当前页面的 HTML 输出。我尝试了以下代码。但我没有得到任何输出,它连续执行。

protected void Page_Load(object sender, EventArgs e)
{
        Http(Request.Url.ToString());
}

public void Http(string url)
{
    if (url.Length > 0)
    {
        Uri myUri = new Uri(url);
        // Create a 'HttpWebRequest' object for the specified url. 
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(myUri);
        // Set the user agent as if we were a web browser
        myHttpWebRequest.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4";

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        var stream = myHttpWebResponse.GetResponseStream();
        var reader = new StreamReader(stream);
        var html = reader.ReadToEnd();
        // Release resources of response object.
        myHttpWebResponse.Close();
        Response.Write(html);
    }
}

这里有什么问题?

还有其他方法可以使用 c# 获取当前页面的 HTML 输出吗?

我也尝试了以下代码:

 protected void Page_Load(object sender, EventArgs e)
{
    Page pp = this.Page;
    StringWriter tw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(tw);
    pp.RenderControl(hw);

    string theOut = tw.ToString().Trim();
    string FilePath = @"D:\Home.txt";

    Stream s = new FileStream(FilePath, FileMode.Create);

    StreamWriter sw = new StreamWriter(s);
    sw.WriteLine(theOut);
    sw.Close(); 
}

通过使用该代码,我可以在“.txt”文件中获取 HTML。但是执行此代码会导致“一个页面只能有一个服务器端表单标签。”错误。谁能帮我解决这个问题?

【问题讨论】:

  • 我正在尝试获取当前页面的输出 HTML,以便我可以解析它以获得一些值。
  • 所以您正在解析当前页面(即要呈现),以便您可以从中获取值以再次呈现它?听起来您应该将这些值作为查询字符串或通过 POST 传递到页面,而不是尝试解析 html。

标签: c# asp.net


【解决方案1】:

Page_Render 事件负责为页面生成 HTML,然后调用 Unload 事件。在这种情况下,您应该能够获得页面的 HTML 输出。

【讨论】:

  • 我尝试了 Page_Render 事件。但是在 Page_Load 之后控件没有转到此事件..!当我尝试 Page_PreRender 时,控件在 Page_Load 之后转到此事件,但结果是相同的,它不断执行..!!
【解决方案2】:

好吧,你将不得不弯曲时空连续体,因为在 Page_Load 事件中没有 html 输出,自然而然你在 http 方法中的请求(这不是很糟糕的名字吗?)会再次调用 Page_Load。

开个玩笑,Page_Load 事件中不能有 html 输出,因为它还没有生成。

更新:

您可以使用 HttpFilter 按页面对生成的输出进行更改,请查看此 SO 答案:

https://stackoverflow.com/a/10215626/351383

【讨论】:

  • “你将不得不弯曲时空连续体”你能详细说明一下吗?
  • 你必须在它开始之前得到输出,所以你的程序需要时间旅行,也就是弯曲时空连续体
  • 你最好描述你想要完成的事情,你不能让 html 对你正在呈现的相同 URI 的另一个请求。
  • 我在页面中有一个 iframe,我需要获取 iframe 的 scr。但是我无法从后面的代码中访问它,因为 iframe 通过自定义小部件嵌入到页面中在 Ektron 中。(我可以使用 java 脚本获取它,但我需要在服务器端获取它)。
【解决方案3】:

你可以试试这个……

public override void Render(HtmlTextWriter writer):
    {
        StringBuilder renderedOutput = new StringBuilder();
        Streamwriter  strWriter = new StringWriter(renderedOutput);
        HtmlTextWriter tWriter = new HtmlTextWriter(strWriter);
        base.Render(tWriter);

        string html = tWriter.InnerWriter.ToString();

        string filename = Server.MapPath(".") + "\\data.txt";
        outputStream = new FileStream(filename, FileMode.Create);
        StreamWriter sWriter = new StreamWriter(outputStream);
        sWriter.Write(renderedOutput.ToString());
        sWriter.Flush();

        //render for output
        writer.Write(renderedOutput.ToString());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多