【问题标题】:The same method with webrequest works in one program but not in another与 webrequest 相同的方法在一个程序中有效,但在另一个程序中无效
【发布时间】:2019-11-27 16:03:03
【问题描述】:

我有一个 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() 永远挂起。

我也在两台不同的机器上试过这个。

我在这里唯一的线索是超时似乎永远不会起作用,这让我觉得网络服务器解决方案中的 webrequest 库出了点问题。但由于两者都没有使用 nuget 包,所以我完全迷失了。

【问题讨论】:

  • 您是否尝试过使用 Web 服务器上的浏览器访问 URL?它可能根本没有访问权限。
  • 使用像wireshark或fiddler这样的嗅探器并验证工作和非工作在第一个请求中是否具有相同的标头。如果不让非工作看起来完全像工作。 Net 中的默认标头与其他方法不同。
  • 我认为您遇到了僵局。您能否向我们提供您调用此 bitly 库的控制台/Web 应用程序中的代码?
  • 使用GetResponse(没有Async)是否解决了问题? ReadToEnd 相同(两者都做)。
  • 两个程序显示相同的 url,并且都在浏览器中工作。

标签: c# timeout webrequest


【解决方案1】:

我最终将代码切换为使用 HttpClient 而不是 WebRequest,问题就解决了。

我不确定为什么 WebRequest 会这样,但它现在工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多