.NET 4.6.2"值不能为空" WebRequest.GetResponse()的异常

时间:2016-11-02 09:47:55

标签: 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/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上运行了相同的代码,没有发生异常。为什么会发生这种异常?

3 个答案:

答案 0 :(得分:6)

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

Connect已经开启了一个问题,但是像往常一样,它将无处可去,并且会在5年内无法修复。

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

我认为在Visual Studio 2017中,您最终可以禁用每个程序集的异常,所以如果这很麻烦,您可以随意下载预览。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

WebRequest.Response was working perfectly for me until I installed SQL Server Management Studio (SSMS). So it looks like SSMS breaks it.

I changed my code to use a lower version of .Net and that resolved the issue.