C# .NET 4.6.2“;值不能为空";WebRequest.GetResponse()处出现异常
当我在.NET 4.6.2上运行以下代码时C# .NET 4.6.2“;值不能为空";WebRequest.GetResponse()处出现异常,c#,.net,webrequest,C#,.net,Webrequest,当我在.NET 4.6.2上运行以下代码时 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
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();
以下异常发生在var res=(HttpWebResponse)req.GetResponse()处代码>
我无法获得更多的信息。我不知道什么值是空的。我在.NET4.5.2上运行了相同的代码,但没有发生异常。为什么会发生此异常?请确保req.GetResponse()在将其强制转换为HttpWebResponse之前实际返回一个值-因此,首先获取该值,执行空检查,然后强制转换是否有值。对于.net 4.5.2,这取决于当没有从服务器收到响应时,req.GetResponse()返回null或否。4.6中的实现可能不同于4.5.2中的实现
底线是-如果不确定是否有值,请不要强制转换值,并使用调试器逐步检查代码。出现这种情况是因为在4.6.2中添加了一些代码,这些代码使用try/catch从注册表中的字符串解析枚举,而大多数人显然没有这样做
关于这一点的一个问题已经公开了,但像往常一样,它将一事无成,并且在5年内不会解决
我不明白他们为什么不用锥虫。我不明白为什么他们在VisualStudio中对异常的支持如此之差的情况下编写了这么多基于异常的代码。现在我每次启动我的项目都会损失30秒,因为我在初始化开始时中断-禁用ArgumentNullException对我来说不是一个选项,如果它发生在我的应用程序代码中,我希望立即中断
我认为在Visual Studio 2017中,您将最终能够禁用每个程序集的异常,因此,如果这太麻烦您,请随时下载预览。WebRequest.Response在我安装SQL Server Management Studio(SSMS)
之前对我来说非常有效。所以它看起来像是SSMS
破坏了它
我将代码更改为使用较低版本的.Net,这解决了问题。使用断点查看哪些内容为空。是否确定在此行中引发异常,而不是在var sr=new StreamReader(res.GetResponseStream())中引发异常代码>GetResponse
似乎不会抛出参数null:而StreamReader将抛出参数null。如果流为null,请发布完整的异常,包括调用堆栈。您可以使用Exception.ToString()
获取它。这将显示异常的实际位置thrown@PanagiotisKanavos,在非用户代码中引发并捕获异常。TS只有一个日志条目。请参阅Benlitz的答案。@adrianm处理的异常不会出现在日志中。实现这一点的唯一方法是在调试时中断所有异常。在调试过程中更容易找到调用堆栈当我第一次看到您的答案时,我误读了该问题的日期为2016年7月(今年)。现在,我又看到了,那是2015年7月。很可能,它永远不会被修复,我宁愿寻找一个解决方法。难以置信的是,他们将在4.7
中推出一个修复程序。请参阅上面链接中David的评论“我们已经解决了这个问题。这个问题已经在.NET Framework 4.7中解决了。我们现在使用.TryParse()而不是.Parse()。这样可以避免生成异常。”
当软件不向后兼容并破坏现有代码时,我“喜欢它”(我的适用于4.5.2,但不适用于4.6.1……)如果我在那里从事软件开发的时候,我们在12月份写的c-r-a-p写得这么差,我们就会破产。(哦!但我们确实破产了!)
Exception Exception thrown: 'System.ArgumentNullException' in mscorlib.dll ("Value cannot be null.") System.ArgumentNullException