在我的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不是线程安全的。但是在围绕上面的代码实现锁定(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而不是实际或至少是空字符串?有什么建议吗?
答案 0 :(得分:0)
在使用块终止之前,WebClientInstance对象无效的事实是奇怪的。我猜它可能与您的应用程序中的资源问题或内存泄漏有关。也许你正在达到线程池的限制,因此你的线程会突然终止。
我还会尝试WebClient的非阻塞方法,例如WebClient.DownloadStringTaskAsync,看看是否有所作为。如果这没有解决问题,我会尝试使用TPL而不是原始线程来进行安全的线程池管理。
答案 1 :(得分:0)
可能是关于安全问题。某些主机需要进行身份验证才能允许读取流。检查远程服务器是否有错误(403)禁止访问。 在这种情况下,您需要传递用户名和密码才能访问该文件。