我有一个 c# 控制台程序使用 webrequest 调用一个工作正常的库方法,但是当我从另一个程序(mvc 站点)调用相同的库方法时,它只是挂起。 即使我给它一个超时值,它也永远不会超时。
console app:
console project
bitly project
mvc site
web server project
bitly project
我已经验证了它与控制台应用程序中的相同值一起工作,但只是与 Web 代码一起坐在那里。
var url = $"https://api-ssl.bitly.com/v3/shorten?access_token={apikey}&longUrl={WebUtility.UrlEncode(longUrl)}";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
try
{
var response = await request.GetResponseAsync();
using (var responseStream = response.GetResponseStream())
{
response.Timeout = 30000
var reader = new StreamReader(responseStream, Encoding.UTF8);
var jsonResponse = JObject.Parse(await reader.ReadToEndAsync());
var statusCode = jsonResponse["status_code"].Value<int>();
if (statusCode == (int)HttpStatusCode.OK)
...
}
}
这是在我创建的bitly.library项目中。 该库仅使用 newtonsoft nuget 包。 如果这是一个问题,调用程序都使用相同的 system.net.http 版本。
我已经验证了这两个程序最终都以相同的 url 发出。
当我从控制台应用程序调用它时,GetResponseStream() 调用会立即返回数据。 当我从 webhook 调用它时(这是针对 sms 系统的),GetResponseStream() 永远挂起。
我也在两台不同的机器上尝试过这个。
我在这里唯一的线索是超时似乎永远不起作用,让我认为 Web 服务器解决方案中的 webrequest 库出了问题。但是由于它没有使用 nuget 包,所以我迷失了它可能是什么。
我最终将代码切换为使用 HttpClient 而不是 WebRequest,问题就解决了。
我不确定为什么WebRequest会这样做,但它现在工作正常。