2016-04-13 7 views
0

In meinem C# -Programm verwende ich WebClient, um eine Zeichenfolge herunterzuladen, die im Allgemeinen funktioniert, aber von Zeit zu Zeit bekomme ich die Ausnahme "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt ".WebClient DownloadString verursacht manchmal "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt" Ausnahme

Das folgende Beispiel zeigt den relevanten Teil des Codes:

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); 

} 

Die Ausnahme bei dieser Codezeile geschieht:

ResponseString = WebClientInstance.DownloadString(URITarget); 

Wie ich Fäden verwendet und damit die Funktion mit dem oben genannten Code kann theoretisch gleichzeitig von verschiedenen Threads aufgerufen werden, dachte ich zuerst das Problem könnte durch die Threads verursacht werden, da der WebClient nicht Thread-sicher ist. Aber nach Schloss (SendWebClientHTTPRequestThreadLock) um den obigen Code Implementierung, dauert es nicht zu einer Verbesserung:

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); 

    } 

} 

Kann es sein, dass WebClientInstance.DownloadString (URITarget) gibt NULL zurück, aus irgendeinem Grunde, anstatt die tatsächlichen oder zumindest eine leere Zeichenfolge ? Irgendwelche Vorschläge?

+1

Der Code, wie er gepostet wird, kann keine "NullReferenceException" auslösen, außer irgendwo in der Implementierung von 'DownloadString'. Bitte posten Sie den gesamten Stack-Trace und geben Sie uns vorzugsweise ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve/), über das hinaus, was Sie für relevant halten. –

+0

Es ist nicht "WebClientInstance.DownloadString (URITarget)", das NULL zurückgibt. Es scheint, dass "WebClientInstance" selbst aus irgendeinem Grund "null" ist und Sie daher keine Methode davon aufrufen können. –

+0

Ich habe meiner Anwendung eine Logik hinzugefügt, um die Analyse des Problems zu verbessern. Leider (oder zum Glück?) Tauchte das Problem seit letzter Woche nicht mehr auf. Ich beobachte weiterhin die Situation und werde sobald wie möglich weitere Einzelheiten aufzeigen. – Reboon

Antwort

0

Die Tatsache, dass Ihr WebClientInstance-Objekt vor dem Beenden des Verwendungsblocks ungültig gemacht wird, ist ungerade. Ich nehme an, dass es mit einem Ressourcenproblem oder einem Speicherverlust in Ihrer Anwendung zusammenhängen könnte. Vielleicht stoßen Sie an die Grenzen des Threadpools und Ihre Threads werden deswegen abrupt beendet.

Ich würde auch versuchen, die nicht-blockierenden Methoden des WebClient, wie WebClient.DownloadStringTaskAsync, und sehen, ob das einen Unterschied macht. Wenn das das Problem nicht löst, würde ich versuchen, die TPL anstelle von rohen Threads für sicheres Thread-Pool-Management zu verwenden.

+0

Es ist mehr als * ungerade * - es ist, durch den Sprachstandard und alle praktischen Compiler-Implementierungen * unmöglich *. Wenn der Aufruf des Konstruktors nicht ausgelöst wird, wird das Ergebnis nicht-'null' sein. Wenn der Variablen keine Zuweisung zugewiesen wird, kann sie nicht "null" werden. Die Laufzeit wird Variablen nicht plötzlich ungültig machen, egal was mit Ressourcen passiert. Wir können daraus schließen, dass das "WebClientInstance-Objekt [getting] nullified" äußerst unwahrscheinlich ist. Es ist viel wahrscheinlicher, dass das OP relevante Details ausgelassen hat. Was Sie vorschlagen, ist das Shotgun-Debugging, das fast nie funktioniert. –

+0

Ja, Sie haben Recht. Ich habe mich nur freundlicherweise auf den Kommentar bezogen, der als Antwort auf Sie oben gepostet wurde ... Das Problem könnte natürlich alles sein, aber da das OP hier nicht die gesamte Bewerbung posten kann, müssen wir einen iterativen Ansatz wählen und irgendwo anfangen oder Wirf die Hände in den Himmel und bezweifle die Frage ... –

+0

Sie können einen Kommentar als Antwort eingeben, wenn (und nur wenn) Sie noch nicht über die Reputation zum Kommentieren verfügen, aber dann hilft es, wenn Sie im Text klarstellen, dass Sie das tun. Der Versuch, die Frage zu verbessern, ist in Ordnung, aber dafür gibt es keine Antworten. –

0

Wahrscheinlich ist über Sicherheitsproblem. Einige Hosts müssen sich authentifizieren, um den Lesestream zu ermöglichen. Überprüfen Sie den Remote-Server auf Fehler (403). In diesem Fall müssen Sie Benutzername und Passwort übergeben, um auf die Datei zugreifen zu können.

+0

Dies könnte ein Kommentar sein .. !! –