您的位置:首页 > 理论基础 > 计算机网络

在用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信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐