Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET 4.6.2“;值不能为空";WebRequest.GetResponse()处出现异常_C#_.net_Webrequest - Fatal编程技术网

C# .NET 4.6.2“;值不能为空";WebRequest.GetResponse()处出现异常

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

当我在.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/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