【问题标题】:MonoTouch: WebConnection crash on resumeMonoTouch:恢复时 WebConnection 崩溃
【发布时间】: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


【解决方案1】:

这个问题在更高版本的 Xamarin (MonoTouch) 中自行消失了,所以我认为这是当时使用的 Mono 版本中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多