【问题标题】:Web Page unreadble when using VB.Net and WebRequest使用 VB.Net 和 WebRequest 时网页不可读
【发布时间】:2021-10-24 02:21:16
【问题描述】:

我有一些简单的 VB.Net 代码,我正在尝试获取一个远程网页。例如,当我使用此代码获取 msn.com 时,该代码始终完美无缺。当我尝试使用此代码访问 amazon.com 时,代码和其他所有请求都完美无缺。但是每个其他请求,特别是如果有一些等待时间,代码会呈现如下:

��Yms�8���_!��` Ӓwwj�4�r�f2�$�3{U����o&@Ɏ��~�I�N���(�� � �4��of���~������ty2��Eg"��G��������_�w&r�C��N�(4�������� �_b����L*���J=?�P��j=����^�}�[n����7�还有更多类似这样的字符。

这可能是超时问题,也可能是响应的页面编码问题。我想不通。

这是代码:(并在我的本地主机上保存为 test.aspx )

<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>

<script language="VB" runat="server">
Sub Page_Load(Sender as Object, E as EventArgs)
Dim q As String 
Randomize
q= (Rnd)
Dim oRequest As WebRequest = WebRequest.Create("https://www.amazon.com/dp/0132350882/?" & q)
Dim oResponse As WebResponse = oRequest.GetResponse()
Dim oStream As Stream = oResponse.GetResponseStream()
Dim oStreamReader As New StreamReader(oStream, Encoding.UTF8)
Response.Write(oStreamReader.ReadToEnd())
oResponse.Close()
oStreamReader.Close()
End Sub
</script>

另外,如果我加载页面,第一次编码是错误的,但如果我快速重新加载页面,第二次编码是正确的。如果我在那之后继续重新加载页面,并且很快我可能会添加,它总是正确的。

提前致谢,

吉姆

好的,我修改了上面的代码成为(它没有解决问题):

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>

<script language="VB" runat="server">
Sub Page_Load(Sender as Object, E as EventArgs)
Dim q As String 
Randomize
q= (Rnd)
Dim oRequest As WebRequest = WebRequest.Create("https://www.amazon.com/dp/0132350882/?" & q)
Dim oResponse As WebResponse = oRequest.GetResponse()
Dim oStream As Stream = oResponse.GetResponseStream()
Dim oStreamReader As New StreamReader(oStream, Encoding.UTF8)
Response.Write(oStreamReader.ReadToEnd())
oResponse.Close()
oStreamReader.Close()
End Sub
</script>
</body>
</html>

但是很奇怪,当远程在浏览器中正确呈现时,里面的所有东西都还在。然而,即使使用更新的代码,当它显示错误的字符集时,它也会被从文档的头部删除。我想知道亚马逊是否正在这样做?

我想说的是,HEAD 中的内容会被剥离出来

【问题讨论】:

  • 你的Response是否指定它的编码也是UTF-8?
  • 这是响应---> Cache-Control: private Content-Length: 1357528 Content-Type: text/html; charset=utf-8 日期:2021 年 8 月 23 日星期一 21:01:32 GMT 服务器:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET
  • 您的Response,您的Write。不是亚马逊的回应。这样浏览器就可以立即知道编码,而不是以后再弄清楚。
  • OK 我刚刚用 Opera 测试过,问题依旧存在,响应头是 ---> Cache-Control: private Content-Length: 235866 Content-Type: text/html; charset=utf-8 日期:星期一,2021 年 8 月 23 日 21:15:14 GMT 服务器:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET

标签: asp.net vb.net


【解决方案1】:

您必须使用HttpWebRequest“模拟”浏览器然后阅读源代码: 下面的代码可能是一个好的开始。

    Randomize()
    Dim q As String = CStr((Rnd()))
    Dim request As HttpWebRequest = CType(WebRequest.Create("https://www.amazon.com/dp/0132350882/?" & q), HttpWebRequest)
    request.Method = "GET"
    request.UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0"
    Using response As WebResponse = request.GetResponse
        If response IsNot Nothing Then
            Using ioStream As IO.Stream = response.GetResponseStream
                Using sr As New System.IO.StreamReader(ioStream)
                    Dim s As String = sr.ReadToEnd
                    Debug.WriteLine(s)
                End Using
            End Using
        End If
    End Using

【讨论】:

  • 或者,投反对票是正确的,但解释了原因。在那种情况下,未来的用户就会知道为什么这种方法不合适。
  • 不是downvoters,但您对 Randomize 的使用让我认为您仍在使用 vb6 随机方法,而不是新的(很多年前新的).net Random 类,它更容易使用。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2015-10-10
  • 2021-12-30
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多