在用HttpWebRequest的时候,发现返回"基础连接已经关闭: 该服务器提交了 HTTP 协议冲突

在用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信息         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值