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\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;
        }
时间: 2024-12-15 21:19:00

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

实现在GET请求下调用WCF服务时传递对象(复合类型)参数

WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法>.<实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法>,在此就不作重述. 实现WCF支持HTTP请求调用容易,但要实现类似MVC的ACTION及WEB API那样的灵活,那就得花费点功夫,为什么这样说

编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Config文件上右击, 通过弹出的" Edit WCF Configuration”(编辑WCF配置)选项来利用GUI界面编辑WCF的配置信息. 但是我在尝试的时候并没有找到这个右键菜单,开始还以为作者弄错了,但又尝试了一会后便发现了窍门. 右键App.Config文件默认是没有" Edit

SSH远程管理服务

作者:Georgekai 归档:学习笔记 2018/1/29 SSH远程管理服务 1.1 SSH服务介绍说明 Secure shell protocol--安全的shell协议 SSH:先对要传输的数据包进行加密处理,然后在进行数据传输,确保了数据的安全 telnet:用于远程连接控制,但不对数据传输进行加密 1.1.1 SSH服务主要提供的两个功能: 1. 远程连接 2. 远程文件传输:如sftp 1.1.2 SSH连接排错思路 1. ping 172.16.1.41 traceroute 1

SpringCloud实战-Hystrix请求熔断与服务降级

我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性. 生活中举个例子,如电力过载保护器,当电流过大的的时候,出问题,过载器会自动断开,从而保护电器不受烧坏.因此Hystrix请求熔

Hystrix请求熔断与服务降级

我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性. 生活中举个例子,如电力过载保护器,当电流过大的的时候,出问题,过载器会自动断开,从而保护电器不受烧坏.因此Hystrix请求熔

Microsoft Windows 远程桌面服务远程执行代码漏洞(CVE-2019-0708)

Windows是一款由美国微软公司开发的窗口化操作系统. 当未经身份验证的攻击者使用 RDP 连接到目标系统并发送经特殊设计的请求时,远程桌面服务(以前称为“终端服务”)中存在远程执行代码漏洞.此漏洞是预身份验证,无需用户交互. <*来源:Microsoft 链接:https://portal.msrc.microsoft.com/zh-CN/security-guidance/advisory/CVE-2019-0708 *> 解决办法 厂商补丁: Microsoft --------- M

F5 iRules-----http请求400/500错误时,重置

#  400/500错误重试 # #当服务返回400/500状态且当前pool中有存活的node重置http请求,并重新选择pool中的node. #直到返回正常代码或者轮询完所有存活node后,接受新的http请求 when CLIENT_ACCEPTED { set retry 0 } when HTTP_REQUEST { set http_request [HTTP::request] } when HTTP_RESPONSE { if { ([HTTP::status] starts_

(转) 发布或重启线上服务时抖动问题解决方案

转自 http://www.cnblogs.com/LBSer/p/3703967.html 相关: load.jstack.Java编译.Java运行模式 一.问题描述       在发布或重启某线上某服务时(jetty8作为服务器),常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落(图1),与此同时响应时间曲线(图2)也与load曲线一致.注:load飙高的初始时刻是应用服务端口打开,流量打入时(Load指的是运行队列(run-queue)的长度:L=等

php请求远程url内容方法

php请求远程url内容有两个方法fopen/file_get_contents和curl. 1,fopen/file_get_contents与curl的差异 (1)fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存.但是CURL会自动对DNS信息进行缓存.对同一域名下的网页或者图片的请求只需要一次DNS查询.这大大减少了DNS查询的次数.所以CURL的性能比fopen /file_get_contents 好很多.(2)fopen /fi