2016-11-02 3 views
2

"Wert kann nicht null sein:" Wenn ich den folgenden Code auf .NET 4.6.2 laufen.NET 4.6.2 Ausnahme bei WebRequest.GetResponse()

var req = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); 
req.Method = "POST"; 
req.ContentType = "application/json"; 
req.Headers.Add("Authorization", "key=my real key is here"); 

string json = "{\r\n \"to\": \"/topics/news\",\r\n \"data\": {\r\n \"item0\": \"0\",\r\n \"item1\": \"1\"\r\n }\r\n}"; 
var jsonbytes = Encoding.UTF8.GetBytes(json); 

var reqStr = req.GetRequestStream(); 
reqStr.Write(jsonbytes, 0, jsonbytes.Length); 
reqStr.Close(); 

var res = (HttpWebResponse)req.GetResponse(); 
Debug.WriteLine(res.StatusCode); 
var sr = new StreamReader(res.GetResponseStream()); 
Debug.Write(sr.ReadToEnd()); 
sr.Close(); 

die folgende Ausnahme bei var res = (HttpWebResponse)req.GetResponse(); auftritt.

Exception Exception thrown: 'System.ArgumentNullException' in mscorlib.dll ("Value cannot be null.") System.ArgumentNullException 

Ich konnte keine weiteren Informationen erhalten. Ich weiß nicht, welcher Wert null ist. Ich habe den gleichen Code auf .NET 4.5.2 ausgeführt, diese Ausnahme ist nicht aufgetreten. Warum tritt diese Ausnahme auf?

+0

Verwenden Sie Haltepunkte, um zu sehen, was null ist. –

+0

Sind Sie sicher, dass die Ausnahme in dieser Zeile und nicht in 'var sr = new StreamReader (res.GetResponseStream());'? 'GetResponse' scheint das Argument nicht auf null zu setzen: https://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponse(v=vs.110).aspx während StreamReader wird, wenn der Stream ist null https://msdn.microsoft.com/en-us/library/yhfzs7at(v=vs.110).aspx – KMoussa

+0

Bitte posten Sie die * full * Ausnahme, einschließlich der Aufrufliste. Sie können es mit 'Exception.ToString()' bekommen. Dies zeigt, wo die Ausnahme tatsächlich geworfen wurde –

Antwort

6

Dies tritt auf, weil in 4.6.2 Code hinzugefügt wurde, der eine try/catch verwendet, um eine Enumeration aus einer Zeichenfolge in Ihrer Registrierung zu analysieren, die anscheinend die meisten Leute nicht haben.

Ein Problem auf Connect wurde dafür geöffnet, aber wie üblich wird es nirgendwohin gehen und geschlossen werden, da nicht in 5 Jahren reparieren wird.

Ich verstehe nicht, warum sie kein TryParse verwendet haben. Und ich verstehe nicht, warum sie so viel ausnahmebasierten Code mit einer so schlechten Unterstützung von Ausnahmen in Visual Studio machen. Jetzt verliere ich jedes Mal, wenn ich mein Projekt starte, 30s, weil ich zu Beginn meiner Initialisierung abbricht - das Deaktivieren von ArgumentNullException ist für mich keine Option, ich möchte sofort brechen, wenn es in meinem Anwendungscode passiert.

Ich denke in Visual Studio 2017 werden Sie schließlich in der Lage sein, Ausnahmen pro Assembly zu deaktivieren, also wenn Sie sich zu sehr stören, zögern Sie nicht, die Vorschau herunterzuladen.

+1

Als ich deine Antwort zum ersten Mal gesehen habe, habe ich das Datum dieser Ausgabe als Juli 2016 falsch gelesen (dieses Jahr).Jetzt sah ich es wieder und es war Juli * 2015 *. Wahrscheinlich wird es nie repariert werden und ich würde eher nach einem Workaround suchen. –

+1

Unglaublich, sie werden eine Verbesserung in '4.7' schieben. Siehe Kommentar von David in dem obigen Link "" Wir haben dieses Problem behoben. Das Update ist bereits in .NET Framework 4.7. Wir verwenden jetzt .TryParse() anstelle von .Parse(). Dadurch werden die generierten Ausnahmen vermieden. "' – TEK

0

Stellen Sie sicher, dass req.GetResponse() tatsächlich einen Wert zurückgibt, bevor Sie es in eine HttpWebResponse umwandeln - also erst den Wert holen, einen Null-Check durchführen und dann umwandeln, wenn er einen Wert hat. In Bezug auf .net 4.5.2 hängt es davon ab, was req.GetResponse() null zurückgibt oder nicht, wenn keine Antwort vom Server empfangen wird. Die Implementierung könnte in 4.6 anders sein als in 4.5.2

Die untere Zeile ist - werfen Sie keinen Wert, wenn Sie nicht sicher sind, ob es einen Wert hat oder nicht, und durchlaufen Sie Ihren Code mit dem Debugger.

+0

Ich liebe es, wenn Software nicht abwärtskompatibel ist und bestehenden Code bricht (meins funktioniert auf 4.5.2., Aber nicht auf 4.6.1. ......) Wenn wir so schlechten Mist bei DEC geschrieben hätten, als ich es war In der Softwareentwicklung wären wir pleite gegangen. (Oh! Aber wir sind pleite gegangen!) –

0

WebRequest.Response funktionierte perfekt für mich, bis ich SQL Server Management Studio (SSMS) installiert habe. So sieht es aus wie SSMS bricht es.

Ich habe meinen Code geändert, um eine niedrigere Version von .Net zu verwenden, und das Problem wurde behoben.

Verwandte Themen