在用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信息