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

网络推广 2025-04-05 12:01www.168986.cn网络推广竞价

在编程世界中,HttpWebRequest对象是我们与服务器沟通的桥梁,有时这座桥梁会遇到一些小小的波折,导致我们遇到三种常见的错误。以下是这三种错误的详解及可能的解决方案,供感兴趣的朋友们参考。

一、服务器提交了协议冲突(System.Net.WebException: 服务器提交了协议冲突)

当你的HttpWebRequest对象尝试与服务器建立连接时,如果服务器使用的协议与你期望的协议不一致,就会引发这种错误。这可能是由于服务器配置错误或者客户端与服务器之间的协议版本不匹配导致的。解决这个问题的方法是确认服务器端的协议设置,确保客户端与服务器使用相同的协议版本。

二、基础连接已经关闭:连接被意外关闭(System.Net.WebException: 基础连接已经关闭: 连接被意外关闭)

这种错误通常发生在HttpWebRequest对象已经与服务器建立了连接,但在数据传输过程中,连接被意外关闭。这可能是由于网络问题、服务器问题或者请求超时导致的。解决这个问题的方法是检查网络连接,确认服务器状态,以及调整请求超时设置。

三、无法发送具有此谓词类型的内容正文(System.Net.ProtocolViolationException: 无法发送具有此谓词类型的内容正文)

这种错误表明你的请求内容不符合服务器的期望。可能是因为请求头的Content-Type与你实际发送的数据类型不匹配,或者请求体格式不正确。解决这个问题的方法是检查你的请求头和请求体,确保它们符合服务器的要求。

TcpClient与HttpWebRequest:轻松搞定网页请求

在网络开发中,获取网页HTML代码是一项常见任务。我们可以使用多种方法实现这一需求,其中TcpClient和HttpWebRequest是两种常见的方式。本文将详细介绍如何使用这两种方式获取HTML源码。

一、TcpClient方式获取HTML源码

TcpClient是一种TCP协议的客户端实现,用于连接服务器并进行数据传输。以下是一个简单的示例代码:

```csharp

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();

RequestHeaders.AppendFormat("{0} {1} HTTP/1.1\r", "GET", URI.PathAndQuery);

RequestHeaders.AppendFormat("Connection:close\r");

RequestHeaders.AppendFormat("Host:{0}\r", URI.Host);

// 其他请求头信息...

byte[] request = Encoding.Default.GetBytes(RequestHeaders.ToString());

clientSocket.Client.Send(request); // 发送请求

Stream readStream = clientSocket.GetStream();

StreamReader sr = new StreamReader(readStream, Encoding.Default);

strHTML = sr.ReadToEnd(); // 获取HTML源码

readStream.Close();

clientSocket.Close();

return strHTML;

}

```

二、HttpWebRequest方式获取HTML源码

HttpWebRequest是.NET框架中用于发送HTTP请求的一个类。使用HttpWebRequest,我们可以更方便地获取网页的HTML源码。以下是使用HttpWebRequest获取HTML源码的示例代码:

```csharp

static string GetHTML(string url, string param)

{

try

{

Uri uri = new Uri(url);

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);

myReq.Headers.Add("Aept-Encoding", "gzip,deflate"); // 设置请求头信息

byte[] byData = Encoding.Default.GetBytes(param); // 参数数据(如果有的话)

myReq.Method = "post"; // 设置请求方法为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.Depress);

StreamReader redStream = new StreamReader(recStream, System.Text.Encoding.Default);

string strHTML = redStream.ReadToEnd(); // 获取HTML源码

redStream.Close(); recStream.Close(); result.Close();

return strHTML;

}

catch (Exception)

{

return "";

}

}

```注意:在实际使用中,需要根据具体情况选择合适的请求方式和处理逻辑。对于简单的GET请求,TcpClient方式可能更简单直接;而对于复杂的POST请求或需要处理Cookie等高级功能,HttpWebRequest则更为方便。还需要注意处理异常和资源的正确释放,以避免内存泄漏和性能问题。

上一篇:寿康公主耶律王子结局 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by