【问题标题】:WebClient DownloadString causes sometimes "object reference not set to an instance of an object" exceptionWebClient DownloadString 有时会导致“对象引用未设置为对象的实例”异常
【发布时间】:2016-08-04 11:46:29
【问题描述】:

在我的 C# 程序中,我使用 WebClient 下载一个通常可以正常工作的字符串,但有时我会收到异常“对象引用未设置为对象的实例”。

以下示例显示了代码的相关部分:

String ResponseString = "";
String URITarget = "..... my URI information .....";

using (WebClient WebClientInstance = new WebClient())
{

    WebClientInstance.Encoding = System.Text.Encoding.UTF8;
    WebClientInstance.Headers.Add("Content-Type", "application/json");

    ResponseString = WebClientInstance.DownloadString(URITarget);

}

异常发生在以下代码行:

ResponseString = WebClientInstance.DownloadString(URITarget);

由于我使用的是线程,因此理论上可以从不同线程同时调用具有上述代码的函数,我首先认为问题可能是由线程引起的,因为 WebClient 不是线程安全的。但是在围绕上面的代码实现lock(SendWebClientHTTPRequestThreadLock)之后,并没有带来任何改进:

private Object SendWebClientHTTPRequestThreadLock = new Object();

...


String ResponseString = "";
String URITarget = "..... my URI information .....";

lock (SendWebClientHTTPRequestThreadLock)
{

    using (WebClient WebClientInstance = new WebClient())
    {

        WebClientInstance.Encoding = System.Text.Encoding.UTF8;
        WebClientInstance.Headers.Add("Content-Type", "application/json");

        ResponseString = WebClientInstance.DownloadString(URITarget);

    }

}

WebClientInstance.DownloadString(URITarget) 会不会因为某种原因返回 NULL 而不是实际的或至少是一个空字符串?有什么建议吗?

【问题讨论】:

  • 发布的代码不能抛出NullReferenceException,除非埋在DownloadString的实现中。请发布整个堆栈跟踪,最好给我们minimal, complete and verifiable example,超出您认为相关的范围。
  • 返回 NULL 的不是 WebClientInstance.DownloadString(URITarget)。由于某种原因,WebClientInstance 本身似乎是null,因此您不能调用它的任何方法。
  • 我在我的应用程序中添加了更多逻辑以改进对问题的分析。不幸的是(或幸运的是?),自上周以来,该问题没有再次出现。我会持续关注情况,并会尽快提供更多详细信息。

标签: c# multithreading webclient nullreferenceexception


【解决方案1】:

您的 WebClientInstance 对象在 using 块终止之前被取消的事实很奇怪。我猜这可能与您的应用程序中的资源问题或内存泄漏有关。也许您正在达到线程池的限制,并且您的线程因此而突然终止。

我也会尝试使用 WebClient 的非阻塞方法,例如 WebClient.DownloadStringTaskAsync,看看是否会有所不同。如果这不能解决问题,我会尝试使用 TPL 而不是原始线程来进行安全线程池管理。

【讨论】:

  • 这不仅仅是奇怪——根据语言标准和所有实际的编译器实现,它不可能。如果构造函数调用没有抛出,结果将是非null。因为没有给变量赋值,所以它不能变成null。无论资源发生了什么,运行时都不会突然使变量无效。我们可以得出结论,“WebClientInstance 对象 [getting] 无效”是极不可能的。 OP更有可能遗漏了相关细节。您猜测的建议是shot弹枪调试,几乎永远不会起作用。
  • 是的,你是对的。我只是好心地参考上面作为对您的回应而发布的评论...问题当然可以是任何问题,但是由于 OP 无法在此处发布整个应用程序,因此我们必须采取迭代方法并从某个地方开始,或者把我们的手举在天空中,然后驳回这个问题......
  • 如果(且仅当)您还没有发表评论的声誉时,您可以发表评论作为答案,但是如果您在文本中明确说明您就是这样,这会有所帮助重新做。尝试改进问题很好,但这不是答案的目的。
  • 感谢您的指导,我当然需要在网站上停留几个小时...
【解决方案2】:

可能是关于安全问题。一些主机需要进行身份验证才能允许读取流。检查远程服务器是否有错误 (403) 禁止。 在这种情况下,您需要传递用户名和密码才能访问该文件。

【讨论】:

  • 这可能是评论..!!
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2013-12-30
相关资源
最近更新 更多