HttpWebRequest的常见错误使用TcpClient可避免

  有时使用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 "";

  }

  }