.NET 4.6.2 "Value cannot be null" 异常 WebRequest.GetResponse()

.NET 4.6.2 "Value cannot be null" exception at WebRequest.GetResponse()

当我在 .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();

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

我无法获得更多信息。我不知道什么值是null。我在 .NET 4.5.2 上 运行 相同的代码,但没有发生异常。为什么会出现这个异常?

确保 req.GetResponse() 实际上 returns 一个值,然后再将其转换为 HttpWebResponse - 所以首先获取该值,进行空检查,然后在它有值时进行转换。关于.net 4.5.2,当没有从服务器收到响应时,这取决于 req.GetResponse() returns null 与否。 4.6 中的实现可能与 4.5.2 中的不同

底线是 - 如果不确定值是否有值,请不要强制转换值,并使用调试器单步执行代码。

发生这种情况是因为在 4.6.2 中添加了一些代码,这些代码使用 try/catch 从注册表中的字符串解析枚举,显然大多数人没有。

Connect 上的一个问题已经为此打开,但像往常一样,它不会有任何进展并被关闭,因为 5 年内不会修复。

我不明白他们为什么不使用 TryParse。而且我不明白为什么他们在 Visual Studio 中做这么多基于异常的代码而对异常的支持如此差。现在我每次开始我的项目时都会损失 30 秒,因为我在初始化开始时就中断了 - 禁用 ArgumentNullException 对我来说不是一个选项,如果它发生在我的应用程序代码中,我想立即中断。

我认为在 Visual Studio 2017 年您将最终能够禁用每个程序集的异常,所以如果这让您感到困扰,请随时下载预览版。

在我安装 SQL Server Management Studio (SSMS) 之前,

WebRequest.Response 对我来说工作得很好。所以看起来 SSMS 打破了它。

我更改了代码以使用较低版本的 .Net 并解决了问题。