1

我的服务器似乎有时会向 webclients 返回错误的 html

我在 VS 2012 中使用 asp.net 4。在 IIS Express 上进行调试。

为了调试这个问题,我想跟踪 asp.net 发送的 html

Global_asax_PreRequestHandlerExecute我可以访问响应代码和状态,但似乎无法找到正文 html

我试着读OutputStream这样的:

Dim ms = New MemoryStream
CurContext.Response.OutputStream.CopyTo(ms)
Dim sr = New StreamReader(ms)
Dim rtext = sr.ReadToEnd

但这会引发NotSupportedException Stream does not support reading.

有任何想法吗?

多谢

编辑

我现在确定测试了

我在页面上有一个带有以下属性的标签

<asp:label id="l" runat="server" Font-Bold="true" Font-Size="X-Large" BackColor="Pink"/>

当在浏览器中显示时,它显示得很好,如下所示:

<span id="C1_FormView1_l" style="background-color:Pink;font-size:X-Large;font-weight:bold;">Processed</span>

但是当我用 webclient 下载时,我得到了

<span id="C1_FormView1_l"><b><font size="6">Processed</font></b></span>

为什么背景色会丢失?顺便说一句,为什么不使用更现代的style属性而不是添加bfont

如果我可以阅读 ResponseStream,我至少会知道它在哪里丢失,即使我现在不知道。

非常感谢你

PS如果.net 4.5对此更好,那么我可能会考虑更改目标框架

4

2 回答 2

1

您可以通过在页面/站点主文件上覆盖 Render 来获取 HTML(并对其进行修改)。

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(ms))
                {
                    HtmlTextWriter tw = new HtmlTextWriter(sw);
                    base.Render(tw);
                    tw.Flush();
                    ms.Position = 0;
                    using (System.IO.StreamReader sr = new System.IO.StreamReader(ms))
                    {
                        string yourHTML = sr.ReadToEnd();
                        // do stuff with yourHTML
                        Response.Write(yourHTML);
                        sr.Close();
                        tw.Dispose();
                    }
                }
            }
        }

在VB中

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        Using ms As New System.IO.MemoryStream()
            Using sw As New System.IO.StreamWriter(ms)
                Dim tw As HtmlTextWriter = New HtmlTextWriter(sw)
                MyBase.Render(tw)
                tw.Flush()
                ms.Position = 0
                Using sr As New System.IO.StreamReader(ms)
                    Dim yourHTML As String = sr.ReadToEnd()
                    'do stuff with yourHTML'
                    Response.Write(yourHTML)
                    sr.Close()
                    tw.Dispose()

                End Using
            End Using
        End Using
    End Sub
于 2012-11-18T12:49:16.287 回答
0

这在技术上并不能回答我原来的问题,但它确实解决了我遇到的问题

问题是html没有正确呈现

我现在记得 aspx 具有自适应渲染,所以我认为请求中使用的用户代理可能是罪魁祸首

我将代码更改为:

 Dim myReq As HttpWebRequest = WebRequest.Create(MailUrl)
 myReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
 Dim resp As HttpWebResponse = myReq.GetResponse
 Dim stream = resp.GetResponseStream
 Dim rdr = New StreamReader(stream)
 Dim BodyText = rdr.ReadToEnd

现在 html 以正确的现代 Html5/Css3 标记呈现

感谢您的帮助和指导。

于 2012-11-20T14:25:59.713 回答