zoukankan      html  css  js  c++  java
  • c#通过webrequest请求远程http服务时出现的问题

    用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
    ", "GET", URI.PathAndQuery);
                RequestHeaders.AppendFormat("Connection:close
    ");
                RequestHeaders.AppendFormat("Host:{0}
    ", URI.Host);
                RequestHeaders.AppendFormat("Accept:*/*
    ");
                RequestHeaders.AppendFormat("Accept-Language:zh-cn
    ");
                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)
    
    ");
                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;
            }
  • 相关阅读:
    列出python中可变数据类型和不可变数据类型,并简述原理
    python 字典操作
    Python的is和==
    python2和python3区别
    下面的代码在Python2中的输出是什么?解释你的答案
    编程用sort进行排序,然后从最后一个元素开始判断,去重
    如何在一个function里面设置一个全局的变量?
    用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
    请写出一段Python代码实现删除一个list里面的重复元素
    什么是lambda函数?它有什么好处?
  • 原文地址:https://www.cnblogs.com/hornet/p/4762254.html
Copyright © 2011-2022 走看看