.net 知识还是 3 年前在学校学的,听朋友说.net core 很好,想把以前的一个后端接口升级一下,结果在 linux centos 系统,无缘无故的超时。
各种办法都试了,怀疑是不是自己的代码太老了,看了一下 httphelper 里面是基于 httpwebrequest,找了一下相关资料,说是对于 https 访问不太友好,尝试了 N 种代码添加的办法,发现还是无济于事。
转变思路,找一下其他的 httphelper,又找到了 httpclient,可是不好用啊,都是最基础的 url 访问,post、get,我需要用到 PostDataType、Allowautoredirect、postfile,都没有,难不成自己造轮子?
ps,我吐槽不是说不能造轮子,不是.net 给的东西不够好,而是,什么年代了,每一个.net 都停留在不断的造轮子时间上,还有时间发展吗?
.net core 你已经是一个成熟的框架了,得要学会自己写代码啊!!!
1
MonoLogueChi 2019-09-03 12:46:18 +08:00 via Android
httpclient 用的比较多,这东西越用越感觉不会的东西越多。以前自己造过很多小轮子,比如 gzip 解压之类的,后来发现这些都是已经封装好的。常用的东西大概率不会没有封装,再好好看一下官方文档。另外可以详细说明一下对 https 访问不友好是指哪方面吗,HttpClient 我没有遇到过什么大坑。
如果你一定要用什么类库,推荐一下 flurl |
2
arrow8899 2019-09-03 13:23:35 +08:00 3
|
3
jtwor 2019-09-03 13:33:06 +08:00
是不是发现传个文件 还要拼接表单文本 惊了
|
4
hackfly 2019-09-03 13:52:42 +08:00
。。。。
|
5
ddgweb OP @MonoLogueChi httpwebreqest 在 linux 访问 https 的 url,会大概率出现超时的情况,并且是无解
|
6
ddgweb OP |
7
MonoLogueChi 2019-09-03 15:13:28 +08:00 via Android
@ddgweb 我真没发现这个问题。我用的 HttpClient,也是在 Linux 上跑到,Debian9 和 Debian10 都没遇到过 https 超时,.net core 2.2
|
8
ddgweb OP @MonoLogueChi 所以,我不想用 httpwberequest,想改用 HTTPclient,但是你知道,httpwebrequest 转 httpclient,很多属性方法都不一样
|
9
xomix 2019-09-03 15:58:01 +08:00
请使用 HttpClient (高并发请使用 HttpClientFactory ),不要再继续使用仅为兼容而迁移的 HttpWebRequest。
至于轮子的问题,HttpClient 本身封装已经很足够了,没有必要再造轮子了,高并发情况下 HttpClientFactory 不知道多方便。 |
10
xomix 2019-09-03 16:00:14 +08:00
@ddgweb #8 是的,这就是让你换过来的原因之一,毕竟 HttpWebRequest 已经不再更新或变化了,仅仅是作为兼容旧版本的一种存在。
|
11
ddgweb OP @xomix 头疼啊,从 httpwebrequest,就没看过内部代码,都是直接用的 httphelper,现在基于 httpclient 的 helper 做的差别太大啊
|
12
xomix 2019-09-03 16:27:28 +08:00
@ddgweb #11 这就不是我能帮你了,我也没法职责你之前设计不够优秀,总之,HttpWebRequest 是在 .net 4.5 之后就不提倡使用的技术了。
|
13
huobazi 2019-09-03 16:29:10 +08:00
看来我用 WebClient 是算刀耕火种了。
|
14
jiaozan 2019-09-03 16:37:49 +08:00
|
15
guolaopi 2019-09-03 16:40:10 +08:00
尝试从 HttpWebRequest 迁移到 HttpClient 试试再说,是有一部分属性方法不一样,但是大体上请求那一套东西差不了太多的。
|
16
ddgweb OP |
17
exonuclease 2019-09-03 16:51:46 +08:00
HttpClient
|
18
chongzi 2019-09-03 16:53:02 +08:00
|
19
nannanziyu 2019-09-03 17:44:57 +08:00
MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(new StreamContent(new System.IO.FileStream("d:/sample.png",FileMode.Open))); await new HttpClient().PostAsync("https://www.example.com",content); Multipart/form-data 上传文件三行 var client = new HttpClient(new HttpClientHandler() {AllowAutoRedirect = false}); Allowautoredirect 开 /关 |
20
nannanziyu 2019-09-03 17:47:45 +08:00
补充一句,楼主你都找到 HttpClient 了
只要随便 google 下结果就出来了 然而你都找不到答案,说明寻找并解决问题的能力很欠缺 而这点是程序员最重要的能力 如果你是我晚辈亲戚的话,我就劝你改行了 |
21
nannanziyu 2019-09-03 17:51:50 +08:00
HttpWebRequest 也是没有问题的,是你代码的 bug
|
22
WeaPoon 2019-09-03 17:56:54 +08:00
去 NuGet 里随便搜一下都一大堆,例如 2 楼的。
|
23
yulitian888 2019-09-03 17:57:38 +08:00
唔,怎么说呢,谁能相信我今年还能看到.net 1.0/1.1 时代的 StringHelper、FileHelper,以及教学示例那种“学生三层”架构运行在商业项目中。
谁能信今年一句 System.IO.Directory.Delete("路径", true);就能搞定的事情,还有人非要写上几十行递归。 所以楼主这个,真不是什么事,太普遍了! |
24
guolaopi 2019-09-03 22:18:16 +08:00
@ddgweb #16
我觉得不算造轮子吧。而是 httpClient 本身就几乎达到轮子的级别了。我们顶多封装一下做泛型方法。 |
25
ddgweb OP @nannanziyu 感谢你敲了一段代码,我看得懂,也能写的出,之所以从 httpwebrequest 转 httpclient,是因为我目前遇到了一个难题,在 linux centos7 系统下,httpwebrequest 和 httpclient,post 访问 https 网站,都会报错 The SSL connection could not be established, see inner exception. The remote certificate is invalid according to the validation procedure.,所以想找一些成熟的框架,正如 2 楼推荐的 RestSharp,依然如此。
|
26
ddgweb OP @yulitian888 我个人觉得 StringHelper、FileHelper 就是一个快捷的好用的实用类,比类库、nuget 便捷高效(方便调试),至于你后半句的调侃,在学生时代大家都是这样过来的,出来写项目肯定会慢慢变好的
|
27
magicdawn 2019-09-03 22:25:17 +08:00
unirest
|
28
guolaopi 2019-09-03 23:10:13 +08:00
|
30
guolaopi 2019-09-03 23:42:38 +08:00
|
32
agdhole 2019-09-04 01:18:45 +08:00
|
33
yulitian888 2019-09-04 12:49:29 +08:00
@ddgweb 然而,这样的代码出自于今年,一位 40 多的老程序员之手,说好的提升在哪儿呢?
|