zoukankan      html  css  js  c++  java
  • HttpWebRequest的常见错误使用TcpClient可避免

    有时使用HttpWebRequest对象会出现错误有三种服务器提交了协议冲突/基础连接已经关闭:连接被意外关闭/无法发送具有此谓词类型的内容正文,感兴趣的朋友可以参考下本文
     
    有时使用HttpWebRequest对象会出现错误,总结有三种:
    1、System.Net.WebException: 服务器提交了协议冲突. Section=ResponseStatusLine
    2、System.Net.WebException: 基础连接已经关闭: 连接被意外关闭。
    3、System.Net.ProtocolViolationException: 无法发送具有此谓词类型的内容正文。
    使用TcpClient对象搞定
    复制代码 代码如下:

    private string GetHTMLTCP(string URL)
    {
    string strHTML = "";//用来保存获得的HTML代码
    TcpClient clientSocket = new TcpClient();
    Uri URI = new Uri(URL);
    clientSocket.Connect(URI.Host, URI.Port);
    StringBuilder RequestHeaders = new StringBuilder();//用来保存HTML协议头部信息
    RequestHeaders.AppendFormat("{0} {1} HTTP/1.1\r\n", "GET", URI.PathAndQuery);
    RequestHeaders.AppendFormat("Connection:close\r\n");
    RequestHeaders.AppendFormat("Host:{0}\r\n", URI.Host);
    RequestHeaders.AppendFormat("Accept:*/*\r\n");
    RequestHeaders.AppendFormat("Accept-Language:zh-cn\r\n");
    RequestHeaders.AppendFormat("User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n");
    Encoding encoding = Encoding.Default;
    byte[] request = encoding.GetBytes(RequestHeaders.ToString());
    clientSocket.Client.Send(request);
    //获取要保存的网络流
    Stream readStream = clientSocket.GetStream();
    StreamReader sr = new StreamReader(readStream, Encoding.Default);
    strHTML = sr.ReadToEnd();
    readStream.Close();
    clientSocket.Close();
    return strHTML;
    }

    使用 HttpWebRequest请求页面
    复制代码 代码如下:

    ///
    /// 获取html源码
    ///
    ///
    ///
    ///
    static string GetHTML(string url, string param)
    {
    try
    {
    Uri uri = new Uri(url);
    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);
    myReq.Headers.Add("Accept-Encoding", "gzip,deflate");//sdch
    byte[] byData = Encoding.Default.GetBytes(param);
    myReq.Method = "post";
    myReq.ContentLength = byData.Length;
    Stream reqStrem = myReq.GetRequestStream();
    reqStrem.Write(byData, 0, byData.Length);
    reqStrem.Close();
    HttpWebResponse result = (HttpWebResponse)myReq.GetResponse();
    Stream recStream = result.GetResponseStream();
    //如果是Gzip方式则需要解压
    recStream = new GZipStream(recStream, CompressionMode.Decompress);
    StreamReader redStream = new StreamReader(recStream, System.Text.Encoding.Default);
    string strHTML = redStream.ReadToEnd();
    redStream.Close();
    recStream.Close();
    result.Close();
    return strHTML;
    }
    catch (Exception)
    {
    return "";
    }
    }
  • 相关阅读:
    <a>标签实现锚点跳跃,<a>标签实现href不跳跃另外加事件(ref传参)
    ThinkPHP实现事务回滚示例代码(附加:PDO的事务处理)
    python 命令执行文件传递参数
    python os.walk()
    python sys.stdin、sys.stdout和sys.stderr
    Python 为什么sys.stdout.write 输出时后面总跟一个数字
    python 不同集合上元素的迭代 chain()
    Python zip() 处理多于两个序列的参数, 存储结对的值
    Python 成对处理数据 zip()
    python 同时迭代多个序列
  • 原文地址:https://www.cnblogs.com/zcm123/p/3031165.html
Copyright © 2011-2022 走看看