【发布时间】:2011-12-30 05:25:28
【问题描述】:
我在 iPad 上使用 MonoTouch 时遇到了以下崩溃。我已经在 iOS 4.2+ 上进行了测试,它似乎发生在所有版本的 iOS 上。这是一个非常难以重现的问题,所以我没有一个好的测试用例。但是,在恢复应用程序时,我收到了许多崩溃。您可以在下面看到此崩溃收到的调用堆栈:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at System.Net.WebConnection.NextRead () [0x00000] in <filename unknown>:0
at System.Net.WebConnectionStream.ReadAll () [0x00000] in <filename unknown>:0
at System.Net.WebConnectionStream.CheckResponseInBuffer () [0x00000] in <filename unknown>:0
at System.Net.WebConnection.ReadDone (IAsyncResult result) [0x00000] in <filename unknown>:0
我的所有应用程序网络访问都包含在 try/catch 块中,并且同步连接发生在单独的线程上,这就是为什么这个调用堆栈让我难过!
如果有人看到或知道原因,请告诉我。如果您对解决它有任何建议,我也很乐意听到这些建议!
这是一个标准线程操作的例子;请记住,所有这些代码都包含在 try/catch 中:
HttpWebRequest r = new HttpWebRequest(Configuration.MasterRequestUri);
r.UserAgent = Configuration.UserAgent;
r.Method = "POST";
r.ContentType = "application/x-www-form-urlencoded";
r.ContentLength = bytes.Length;
r.Timeout = 10000;
r.ReadWriteTimeout = 10000;
r.CachePolicy = Configuration.CachePolicy;
r.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
r.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
Stream s = r.GetRequestStream();
s.Write(bytes, 0, bytes.Length);
s.Flush ();
s.Close ();
WebResponse wr = r.GetResponse();
s = wr.GetResponseStream();
using(StreamReader sr = new StreamReader(s))
{
string responseString = sr.ReadToEnd();
// Parses the string and what not
}
【问题讨论】:
-
看看你在哪里调用 Stream s = r.GetRequestStream 问题如果不写 Stream s = null; 这会创建一个新流吗?然后新建 r 的实例,对 wr 执行同样的操作,错误实际发生在哪一行。你能调试一下并查看实例错误发生在哪里吗?还有什么是你正在寻找的文件或文件的名称..错误表明未知文件名
-
感谢 DJ 的回复。看看顶部的调用堆栈,实际上在读取尝试期间,Mono WebConnection.cs 文件中发生了错误。它没有给我任何额外的信息,也没有显示我的应用程序的入口点;这很奇怪。
-
对于初学者来说仍然看起来有点奇怪,您可以检查以确保您在 r.GetResponse() 的地方得到任何东西,还想知道这是否可能是一个 url 编码问题.. 但请检查看看 s 是否有任何东西你可以做任何 Response.Writes 来检查.. 看起来在你的 StreamReader sr 中你正在创建 StreamReader 但你正在尝试将 sr.ReadtoEnd 的值分配给一个字符串我会考虑将 sr 读入一个 List
或其他一些集合,但看起来不正确我可能是错的 -
试试这个链接,看看你是否可以改变你的代码来匹配 StackOverFlow stackoverflow.com/questions/6077862/…987654321@上一篇文章中的例子
-
谢谢 DJ。我的问题有点不同;我发布的代码在 99% 的时间里都能正常工作,当它出现 HTTP 错误时,它会通过 try/catch 中的逻辑进行优雅的处理。问题是在非常罕见的情况下,在恢复应用程序时会发生崩溃,并且由于此时调试器无法连接,所以我只剩下上面发布的调用堆栈。
标签: c# .net mono crash xamarin.ios