princeoicq

princeoicq

导航

c#通过webrequest请求远程http服务时出现的问题

Posted on 2011-10-19 17:51  princeoicq  阅读(1919)  评论(0)    收藏  举报

c#通过webrequest请求远程http服务时出现的问题(转载

(2010-08-04 14:12:47)
标签:

杂谈

现象:

     用WebRequest和WebClient,两种方式,请求一个由http服务发布的应用,结果出现异常。

     有三种,1、System.Net.WebException: 服务器提交了协议冲突. Section=ResponseStatusLine

                 2、System.Net.WebException: 基础连接已经关闭: 连接被意外关闭。
                 3、System.Net.ProtocolViolationException: 无法发送具有此谓词类型的内容正文。

     另外,用同样的代码,请求普通的页面没问题,返回正常。

分析:

      1、所请求的应用,虽然应用了http服务,但却没有完全遵守http协议。导致,请求时需要某些参数配合。

      2、WebRequest和WebClient,可配置的参数很少,有可能不会满足要求。

      3、其实http服务,就是TCP协议的一个特例,所有能解决TCP问题的方法,都可用在http上

解决:

      1、先想到Socket应用,因为它是解决TCP的最基本方法。不过,由于对http请求的头,没有太深的研究,结果失败。

      2、想到了原来使用过的TcpClient,比Socket用起来方便些。问题解决了。

源码:

      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();//用来保存HTML协议头部信息
            RequestHeaders.AppendFormat("{0} {1} HTTP/1.1\r\n", "GET", URI.PathAndQuery);
            RequestHeaders.AppendFormat("Connection:close\r\n");
            RequestHeaders.AppendFormat("Host:{0}\r\n", URI.Host);
            RequestHeaders.AppendFormat("Accept:*/*\r\n");
            RequestHeaders.AppendFormat("Accept-Language:zh-cn\r\n");
            RequestHeaders.AppendFormat("User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n");
            Encoding encoding = Encoding.Default;
            byte[] request = encoding.GetBytes(RequestHeaders.ToString());
            clientSocket.Client.Send(request);
            //获取要保存的网络流
            Stream readStream = clientSocket.GetStream();
            StreamReader sr = new StreamReader(readStream, Encoding.Default);
            strHTML = sr.ReadToEnd();


            readStream.Close();
            clientSocket.Close();

            return strHTML;
        }

总结:

      1、不能一颗树上吊死,多换几种思路可能会豁然开朗。

      2、WebRequest和WebClient,可能也能解决问题,只是还没找到那些需要做特殊配置的参数是哪些。

 

 

 

 

 

本地接收百度等外部文件显示结果 使用TcpClient可避免HttpWebRequest的常见错误
2011-10-18 15:28

 

有时使用HttpWebRequest对象会出现错误,总结有三种:

1、System.Net.WebException: 服务器提交了协议冲突. Section=ResponseStatusLine

2、System.Net.WebException: 基础连接已经关闭: 连接被意外关闭。
3、System.Net.ProtocolViolationException: 无法发送具有此谓词类型的内容正文。

 

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();//用来保存HTML协议头部信息
            RequestHeaders.AppendFormat("{0} {1} HTTP/1.1\r\n", "GET", URI.PathAndQuery);
            RequestHeaders.AppendFormat("Connection:close\r\n");
            RequestHeaders.AppendFormat("Host:{0}\r\n", URI.Host);
            RequestHeaders.AppendFormat("Accept:*/*\r\n");
            RequestHeaders.AppendFormat("Accept-Language:zh-cn\r\n");
            RequestHeaders.AppendFormat("User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n");
            Encoding encoding = Encoding.Default;
            byte[] request = encoding.GetBytes(RequestHeaders.ToString());
            clientSocket.Client.Send(request);
            //获取要保存的网络流
            Stream readStream = clientSocket.GetStream();
            StreamReader sr = new StreamReader(readStream, Encoding.Default);
            strHTML = sr.ReadToEnd();


            readStream.Close();
            clientSocket.Close();

            return strHTML;
        }

-------------------------------------------------------------------------------------------------------------------------------------------------

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Net;
using System.Text;
using System.IO;


using System.Net.Sockets;

public partial class TEST_XMLHTTPREQUEST_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //string name = "";
        //name = Request.QueryString["username"];
        //Response.Write(name);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
              Response.Write(GetHTMLTCP("http://www.baidu.com/s?wd=中国&pn=30"));

    }
    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();//用来保存HTML协议头部信息
        RequestHeaders.AppendFormat("{0} {1} HTTP/1.1\r\n", "GET", URI.PathAndQuery);
        RequestHeaders.AppendFormat("Connection:close\r\n");
        RequestHeaders.AppendFormat("Host:{0}\r\n", URI.Host);
        RequestHeaders.AppendFormat("Accept:*/*\r\n");
        RequestHeaders.AppendFormat("Accept-Language:zh-cn\r\n");
        RequestHeaders.AppendFormat("User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n");
        Encoding encoding = Encoding.Default;
        byte[] request = encoding.GetBytes(RequestHeaders.ToString());
        clientSocket.Client.Send(request);
        //获取要保存的网络流
        Stream readStream = clientSocket.GetStream();
        StreamReader sr = new StreamReader(readStream, Encoding.Default);
        strHTML = sr.ReadToEnd();


        readStream.Close();
        clientSocket.Close();

        return strHTML;
    }

}