我在使用 Xamarin 构建的 iOS 应用程序中进行 Web 服务调用时遇到问题。这个完全相同的代码,它构建一个请求并使用 HTTPWebRequest GetResponse() 来获取响应,曾经可以工作,但现在它在尝试获取响应时崩溃了。它在 ReadToEnd 上崩溃,说参数不能为空。该代码自运行以来一直保持不变。我知道 400 有响应,因为 PostMan 可以工作,而且当我从 Xamarin 应用程序拨打电话时,我还可以看到来自后端的日志。搜索 stackoverflow 发现有些人通过升级 Xamarin 解决了这个问题,并且它与它使用的单声道运行时有关。但是最新版本的 Xamarin 正在为我做同样的事情。
...
} catch(WebException ex) {
try {
if(ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError) throw;
...
Stream data = ex.Response.GetResponseStream(); if(data==null) return "ERR";
StreamReader reader = new StreamReader(data); if(reader==null) return "ERR";
string responseFromServer = reader.ReadToEnd();
预期的结果应该是我的 GetResponse 在 HTTP 400 的情况下确实会生成一个 WebException,但是仍然应该有一个响应正文要读取。
这是异常的堆栈跟踪:
2019-04-02 09:15:17.367099-0400 ******.iOS[41201:4512789] *****> System.Net.WebException: Value cannot be null.
Parameter name: src ---> System.ArgumentNullException: Value cannot be null.
Parameter name: src
at System.Buffer.BlockCopy (System.Array src, System.Int32 srcOffset, System.Array dst, System.Int32 dstOffset, System.Int32 count) [0x00003] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.16/src/Xamarin.iOS/mcs/class/corlib/ReferenceSources/Buffer.cs:39
at System.Net.WebResponseStream+<ProcessRead>d__49.MoveNext () [0x00082] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.16/src/Xamarin.iOS/mcs/class/System/System.Net/WebResponseStream.cs:203
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest+<RunWithTimeoutWorker>d__241`1[T].MoveNext () [0x000e8] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.16/src/Xamarin.iOS/mcs/class/System/System.Net/HttpWebRequest.cs:956
--- End of stack trace from previous location where exception was thrown ---
at System.Net.WebConnectionStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 count) [0x00070] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.16/src/Xamarin.iOS/mcs/class/System/System.Net/WebConnectionStream.cs:136
at System.IO.Stream.ReadByte () [0x00007] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.16/src/Xamarin.iOS/mcs/class/referencesource/mscorlib/system/io/stream.cs:758
at *****.API.callService (System.String endpt, System.String parm, System.Boolean isGet) [0x003e9] in /Users/****/Projects/*****/*****/API.cs:80