为啥我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作?

Posted

技术标签:

【中文标题】为啥我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作?【英文标题】:Why would my C# app fail on this REST request but but works fine through a browser?为什么我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作? 【发布时间】:2015-12-31 04:38:23 【问题描述】:

我有一个 C# 应用程序,我正在通过 REST 访问一些数据,因此我传入一个 URL 以获取 JSON 有效负载。我以编程方式访问了几个不同的 URL,使用下面的代码,它们都可以正常工作除了一次调用

这是我的代码:

 var url = "http://theRESTURL.com/rest/API/myRequest";
 var results = GetHTTPClient().GetStringAsync(url).Result;
 var restResponse = new RestSharp.RestResponse();
 restResponse.Content = results;
 var _deserializer = new JsonDeserializer();

GetHTTPClient() 在哪里使用下面的代码:

private HttpClient GetHTTPClient()

  var httpClient = new HttpClient(new HttpClientHandler()
  
     Credentials = new System.Net.NetworkCredential("usr", "pwd"),
     UseDefaultCredentials = false,
     UseProxy = true,
     Proxy = new WebProxy(new Uri("http://myproxy.com:8080")),
     AllowAutoRedirect = false
  );
  httpClient.Timeout = new TimeSpan(0,0, 3500);
  return httpClient;
 

正如我所说,上面的代码工作正常,但有一堆不同的请求,但对于一个特定的请求,我在

 .GetStringAsync(url).Result

调用错误:

无法从传输连接读取数据:现有连接被远程主机强行关闭

等待大约 10 分钟后,我收到了该错误。有趣的是,如果我直接将无法使用的相同 URL 放入 Internet Explorer,我确实会返回 JSON 有效负载(大约 10 分钟后)。所以我很困惑为什么

直接在浏览器中可以正常工作,但在使用上面的代码时会失败。 这一个请求失败,但使用相同代码的其他请求以编程方式工作正常。

对于尝试的事情有什么建议,或者我应该要求服务器所有者检查他们的结果以帮助诊断发生了什么?

【问题讨论】:

检查浏览器发出的请求。 很可能是标题/协商或超时问题。我通常使用fiddler来做这种检查。 尽量避免使用Task.Result,它可能会导致死锁,这可能是这里的罪魁祸首,而不是await任务来得到它的结果。 @LasseV.Karlsen - 你能给我一个你在说什么的例子吗? 你可以这样写那行代码:var results = await GetHTTPClient().GetStringAsync(url); 这意味着这行代码的方法也必须是异步的,但是更多信息请看这里:Don't Block on Async Code。 【参考方案1】:

我认为这里超时不是问题,因为错误表明连接已远程关闭,并且设置的超时时间约为 58 分钟,与您的其他数字相比,这已经绰绰有余了。

您是否尝试过查看请求本身?可能想用这些结果编辑您的问题。

【讨论】:

我同意我的超时长度比我收到此错误的时间长得多。您能否澄清您的问题“查看请求本身?”。你有什么建议? 使用 fiddler 可以准确地看到你的请求头是什么样子,只需比较浏览器和应用请求的头。此外,按照建议,检查所涉及的代理。 事实证明,我的 REST 调用与浏览器使用了不同的代理。一旦我纠正它按预期工作【参考方案2】:

如果您删除行 httpClient.Timeout = new TimeSpan(0,0, 3500);,问题应该会得到解决,但如果请求会持续 20 分钟,您应该一直等待。

【讨论】:

我不明白这一点,因为我的超时时间远大于 20 分钟? 对不起!我读过 350。350 秒是 5 分钟,因为它写在你的问题中。我的错。 20分钟就是一个例子。但是,您是否尝试删除该行?

以上是关于为啥我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 codeIgniter 显示在此服务器上未找到请求的 URL?

Spring Data Rest 和 Cors

为啥当我将查询字符串添加到我的 url 时,它会被 xampp 拒绝(“在此服务器上找不到请求的 URL”)

为啥从模拟器的android应用程序调用REST API端点时连接失败

为啥 C# 编译器会在此代码上崩溃?

为啥 Spring Rest 服务在第一次请求时很慢?