System.Net.WebException:“操作超时”。
我是用了netcore 写了一个服务。
[Route(
"api/[controller]"
)]
public
class
ValuesController : Controller
{
[HttpGet]
public
IEnumerable<
string
> Get()
{
List<
string
> ss =
new
List<
string
>() { };
return
ss;
}
}
直接用浏览器http://localhost:55579/api/values 返回正常的[]字符串。
然后使用httpwebrequest去请求数据(这个是另外一个asp.net程序):
public
static
string
GetHtmlStr(
string
url,
string
encoding,
int
timeOut)
{
string
htmlStr =
""
;
if
(!String.IsNullOrEmpty(url))
{
HttpWebRequest request =
null
;
WebResponse response =
null
;
Stream datastream =
null
;
StreamReader reader =
null
;
try
{
request = (HttpWebRequest)WebRequest.Create(url);
//实例化WebRequest对象
request.UserAgent =
"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Mobile Safari/537.36"
;
request.Method =
"GET"
;
request.Timeout = timeOut;
request.ReadWriteTimeout = 5000;
// request.KeepAlive = true;
// request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
// request.ServicePoint.Expect100Continue = false;//如果服务器返回错误,他还会继续再去请求,不会使用之前的错误数据,做返回数据
// System.Net.ServicePointManager.DefaultConnectionLimit = 50;
request.Proxy =
null
;
response = request.GetResponse();
//创建WebResponse对象
datastream = response.GetResponseStream();
//创建流对象
Encoding ec = Encoding.Default;
if
(encoding ==
"UTF8"
)
{
ec = Encoding.UTF8;
}
else
if
(encoding ==
"Default"
)
{
ec = Encoding.Default;
}
else
if
(encoding ==
"gbk"
)
{
ec = Encoding.GetEncoding(
"gbk"
);
}
reader =
new
StreamReader(datastream, ec);
//to
//todo
htmlStr = reader.ReadToEnd();
//读取数据
}
catch
(Exception ex)
{
throw
ex;
}
finally
{
if
(request !=
null
)
request.Abort();
if
(response !=
null
)
response.Close();
if
(datastream !=
null
)
datastream.Close();
if
(reader !=
null
)
reader.Close();
}
}
return
htmlStr;
}
使用该方法请求,正常情况是返回[] 这样的字符串,但却提示“操作超时”
当我通过netcore 打断点发现,上面方法实际上已经被netcore程序接收并且已经返回了数据。这就奇怪为什么服务器返回成功,接收程序会依然产生超时问题,实际上我通过Chrome把对应HttpWebRequest 的请求参数设置的跟Chrome一样,依然是如此。
不过后来我尝试使用,HttpClient的GetStringAsync方法,发现实现了正常返回。
WebClient 的DownloadString 方法,返回依然是操作超时,资源代下载99dxz
WebClient 的DownloadStringAsync方法,返回正常。
我们通过上面HttpClient ,和WebClient 的DownloadStringAsync方法有个共同点,就是异步操作,都操作成功了,很奇怪,因为http://localhost:55579/api/values这个资源本身就在本地,返回时间几乎是可以忽略不计的。我希望知道HttpWebRequest 直接操作如何使代码能正常运行,以及其中原因,为何使用其他的异步方法却能成功,实际上我已经多次遇到这种情况,特别是需要使用到某些别人网站的接口的时候,用浏览器打开正常,用HttpWebRequest 提示超时的情况。
请求大家帮忙,真只有100积分了。
中间有代理的话,可能会有类似问题。例如开着Fiddlercore之类的
使用一个 http 调试器调试,例如 Fiddler。先把你的 asp.net 放到一边。微软的 asp.net 15年来就一直有个毛病,从来不知道“前端”出发来引导潮流,(最近15年)只知道复制模仿 java。
实际上要想掌握 html 层面的界面程序开发,你要从 http 调试、javascript 调试入手。而如果仅仅从什么服务器的程序去调试就等于被关在笼子里的鸟儿根本不理解天空。
1、GetStringAsync和DownloadStringAsync都是异步操作,只要调用成功就会返回成功,并不是返回数据了才返回成功。
另外无意中搜索了一下解决办法:https://blog.csdn.net/weixin_30824277/article/details/98999774?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase
非常感谢各位帮我解惑,特别是 以专业开发人员为伍 老哥每次有问题都能给我帮助。