HttpWebRequest的常见错误使用TcpClient可避免
在编程世界中,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则更为方便。还需要注意处理异常和资源的正确释放,以避免内存泄漏和性能问题。
网络推广网站
- HttpWebRequest的常见错误使用TcpClient可避免
- 寿康公主耶律王子结局
- jQuery实现多张图片上传预览(不经过后端处理)
- vue采用EventBus实现跨组件通信及注意事项小结
- 企业管理器备份和还原SQL Server数据库
- 关于页面刷新vuex数据消失问题解决方案
- JS Object.preventExtensions(),Object.seal()与Object.freeze()用
- jQuery实现tab标签自动切换的方法
- jennie成立个人厂牌
- 快乐大本营韩国特辑
- ExtJs异步无法向外传值和赋值的完美解决办法
- AJAX对服务器返回XML的处理方法
- 使用ajax接收后台发送过来的json数据方法
- hibernate mapping配置
- 毛病中的毛指的是什么动物的毛
- Nodejs内存治理