2016-11-02 3 views
2

내가 .NET 4.6.2에서 다음 코드를 실행,.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();에서 발생 WebRequest.GetResponse에서 예외 "값은 null 일 수 없습니다".

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

더 이상 정보를 얻을 수 없습니다. 나는 어떤 가치가 null인지 모른다. 나는 .NET 4.5.2에서 같은 코드를 실행했는데 예외는 발생하지 않았다. 이 예외가 발생하는 이유는 무엇입니까?

+0

null이있는 것을 보려면 중단 점을 사용하십시오. –

+0

'var sr = new StreamReader (res.GetResponseStream());'가 아닌이 줄에 예외가 발생 했습니까? 'GetResponse'는 인수 null을 던지지 않는 것 같습니다 : https://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponse(v=vs.110).aspx StreamReader ctor는 stream is null입니다. https://msdn.microsoft.com/en-us/library/yhfzs7at(v=vs.110).aspx – KMoussa

+0

호출 스택을 포함하여 * 전체 * 예외를 게시하십시오. 'Exception.ToString()'으로 얻을 수 있습니다. 이 예외가 실제로 던져진 곳을 표시합니다 –

답변

6

이것은 대부분의 사람들이 가지고 있지 않은 레지스트리의 문자열에서 열거 형을 분석하기 위해 try/catch를 사용하는 일부 코드가 4.6.2에 추가 되었기 때문에 발생합니다.

Connect에 대한 문제가 열렸지 만, 평소와 같이 아무데도 나가지 않고 5 년간 해결되지 않을 것입니다.

TryParse를 사용하지 않은 이유를 알지 못합니다. 그리고 저는 왜 그들이 Visual Studio에서 이러한 예외 지원이 부족한 예외 기반 코드를 그렇게 많이하는지 이해하지 못합니다. 이제는 초기화 초기에 깨 졌기 때문에 프로젝트를 시작할 때마다 30 초 가량 느려지고 있습니다. ArgumentNullException을 사용하지 못하게하는 옵션이 내 응용 프로그램 코드에서 발생하면 즉시 중단하고 싶습니다.

Visual Studio 2017에서는 마침내 어셈블리 별 예외를 비활성화 할 수 있다고 생각합니다. 너무 복잡하면 미리보기를 다운로드 할 필요가 없습니다.

+1

처음 대답을 보았을 때, 나는 그 문제의 날짜를 2016 년 7 월 (올해)로 잘못 읽었습니다.이제 다시 보았고, 2015 * 7 월이었습니다. 아마, 그것은 결코 고칠 것이고 나는 오히려 해결 방법을 찾을 것입니다. –

+1

놀랍게도, 그들은 4.7에서 수정을하려고합니다. 위의 링크에서 David의 의견보기 "이 문제는 .NET Framework 4.7에서 이미 수정되었으며 .Parse() 대신 .TryParse()를 사용하므로 예외가 발생하지 않습니다." – TEK

0

req.GetResponse()가 HttpWebResponse에 캐스트하기 전에 실제로 값을 반환하는지 확인하십시오. 먼저 값을 가져 와서 null 체크를 한 다음 값이 있으면 캐스팅하십시오. .net 4.5.2와 관련하여 req.GetResponse()가 서버에서 응답을받지 못하면 null을 반환하는지 여부에 따라 다릅니다. 4.6에서 구현이 4.5.2와 다를 수 있습니다.

최종 줄은 - 값이 있는지 여부가 확실하지 않은 경우 값을 전송하지 말고 디버거를 사용하여 코드를 단계별 실행하십시오.

+0

소프트웨어가 이전 버전과 호환되지 않고 기존 코드를 깨뜨릴 때 나는 그것을 좋아한다. (4.5.2에서는 작동하지만 4.6.1에서는 작동하지 않는다. ...) 만약 내가 DEC 거기서 소프트웨어 개발에, 우리는 흉상을 떠났을 것입니다. (오!하지만 우리는 흉상이났다!) –

0

SQL Server Management Studio (SSMS)을 설치하기 전까지 WebRequest.Response가 완벽하게 작동했습니다. 그래서 SSMS이 고장났습니다.

.Net의 하위 버전을 사용하도록 코드를 변경했으며 문제가 해결되었습니다.

관련 문제