在用HttpWebRequest的时候,发现返回"基础连接已经关闭: 该服务器提交了 HTTP 协议冲突
2013-01-29 15:36
821 查看
在用HttpWebRequest的时候,发现返回"基础连接已经关闭: 该服务器提交了 HTTP 协议冲突".原来是微软没有容忍不符合RFC 822中的httpHeader中一些字符的问题(如空格),还有必须以CRLF结束的规定的服务器响应。
1。对于诸如空格问题引起的问题,建议不要采用HttpWebRequest类。采用底层的Socket来编写,例子如下:
程序代码
string buffer = "GET /Submit%20CommandId...";
string strAgent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)";
buffer = buffer+"User-Agent: "+ strAgent +"\n\n";
try
{
int port = ..;
string host = "..";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Conneting...");
c.Connect(ipe);//连接到服务器
if(c.Connected)
{
byte[] bs = Encoding.ASCII.GetBytes(buffer);
Console.WriteLine("Send Message:"+buffer);
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息
}
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
}
Console.WriteLine("Press Enter to Exit");
2.必须以CRLF结束的规定的服务器响应
一个解决方案是在application.config或web.config文件里加入
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
允许系统容忍(tolerant)只以CR或LF结尾的hearder信息
1。对于诸如空格问题引起的问题,建议不要采用HttpWebRequest类。采用底层的Socket来编写,例子如下:
程序代码
string buffer = "GET /Submit%20CommandId...";
string strAgent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)";
buffer = buffer+"User-Agent: "+ strAgent +"\n\n";
try
{
int port = ..;
string host = "..";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Conneting...");
c.Connect(ipe);//连接到服务器
if(c.Connected)
{
byte[] bs = Encoding.ASCII.GetBytes(buffer);
Console.WriteLine("Send Message:"+buffer);
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息
}
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
}
Console.WriteLine("Press Enter to Exit");
2.必须以CRLF结束的规定的服务器响应
一个解决方案是在application.config或web.config文件里加入
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
允许系统容忍(tolerant)只以CR或LF结尾的hearder信息
相关文章推荐
- FtpWebRequest 的杂症 - "The server committed a protocol violation","基础连接已经关闭: 服务器提交了协议冲突"
- asp.net使用FtpWebRequest向ftp上传文件报错 基础连接已经关闭: 服务器提交了协议冲突
- 基础连接已经关闭: 该服务器提交了 HTTP 协议冲突?
- 基础连接已经关闭: 该服务器提交了 HTTP 协议冲突
- HttpWebRequest加载证书请求远端https服务器时 : 基础连接已经关闭: 无法与远程服务器建立信任关系
- HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
- .NET HttpWebResponse.GetResponse() 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
- C#利用HttpWebRequest后台请求,出现:基础连接已经关闭: 接收时发生错误;【解决方法之一】
- httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭
- HttpWebRequest 基础连接已经关闭: 接收时发生错误
- httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭
- HttpWebResponse.GetResponse() 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
- FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
- FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
- 用httpWebRequest调用https开头的php webservice,报“基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系”错误的解决方法
- FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
- httpwebrequest 服务器提交了协议冲突. section=responsestatusline
- HttpWebResponse.GetResponse() 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
- .net中FTP GetResponse“基础连接已关闭:服务器提交了协议冲突”的解决办法