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;
}
c#通过webrequest请求远程http服务时出现的问题的更多相关文章
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
- (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法
原文:http://www.chunfengxiyu.com/ws2008-mstsc-privilege.html WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服 ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- Windows批处理:请求远程协助
公司办公场地分别在两个不同的楼层,处理问题要来回跑,所以思考使用远程访问的方式解决问题.同事大多对电脑不熟悉,使用「通讯软件」和「电话」教同事开启远程桌面沟通成本挺高,另外公司IP地址.账号密码都没统 ...
- 如何从零开始实现一个soa远程调用服务基础组件
说起soa远程调用基础组件,最著名的莫过于淘宝的dubbo了,目前很多的大型互联网公司都有一套自己的远程服务调用分布式框架,或者是使用开源的(例如dubbo),或者是自己基于某种协议(例如hessia ...
- SpringCloud实战-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- Hystrix请求熔断与服务降级
Hystrix请求熔断与服务降级 https://www.cnblogs.com/huangjuncong/p/9026949.html SpringCloud实战-Hystrix请求熔断与服务降级 ...
- Springcloud踩坑记---使用feignclient远程调用服务404
公司项目进行微服务改造,由之前的dubbo改用SpringCloud,微服务之间通过FeignClient进行调用,今天在测试的时候,eureka注册中心有相应的服务,但feignclient就是无法 ...
随机推荐
- Java集合----Set集合
Set集合 Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败. Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法 Ha ...
- join()函数的用法【python】
转自:http://www.jb51.net/article/63598.htm
- Python 流程控制:while
while 语法如下,当条件为假时循环才退出,否则会一直循环下去: while 条件: 执行语句 当条件为假时,才会执行else语句: while 条件: 执行语句 else: 执行语句
- 用gcc编译成可执行程序 (转)
#gcc hello.c 该命令将hello.c直接生成最终二进制可执行程序a.out 这条命令隐含执行了(1)预处理.(2)汇编.(3)编译并(4)链接形成最终的二进制可执行程序.这里未指定输出文件 ...
- lua和C++交互的lua栈操作——以LuaTinker为例
一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...
- (二)微信小程序的三种传值方式
1.全局变量 app.js里 App({ //全局变量 globalData: { userInfo: null, host: 'http://localhost:8080/data.json' } ...
- [HNOI2004] 打砖块
1292. [HNOI2004] 打砖块 ★★ 输入文件:brike.in 输出文件:brike.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在一个凹槽中放 ...
- Suricata开源IDS安装与配置
开源IDS Suricata安装 Linux下的依赖问题的解决 在Debian,Ubuntu或者Linux Mint系列 $ sudo apt-get install wget build-essen ...
- Git学习笔记(SourceTree克隆、提交、推送、拉取等)
学习一下sourcetree使用git 目录 一 克隆Clone 二 提交Commit和推送Push 三 拉取pull和获取fetch 四 版本回退reset 五 检出checkout 六 标签Tag ...
- 【BZOJ3470】Freda’s Walk 概率与期望
[BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...