HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有
Posted
技术标签:
【中文标题】HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有【英文标题】:HttpClient.SendAsync throws ObjectDisposedException on Xamarin.Forms Android but not on UWP 【发布时间】:2020-01-27 14:35:17 【问题描述】:我正在编写一个 Xamarin.Forms 应用程序,并且正在尝试使用一些 JSON 有效负载向我的网络服务器发布一个帖子。
这在 UWP 中运行良好,但在 android 上出现以下错误:
System.ObjectDisposedException: Can not access a closed Stream.
at System.IO.StreamHelpers.ValidateCopyToArgs (System.IO.Stream source, System.IO.Stream destination, System.Int32 bufferSize) [0x0003a] in <19853c43ab794d18ab1a33ecb65b3c4d>:0
at System.IO.MemoryStream.CopyToAsync (System.IO.Stream destination, System.Int32 bufferSize, System.Threading.CancellationToken cancellationToken) [0x00000] in <19853c43ab794d18ab1a33ecb65b3c4d>:0
at Xamarin.Android.Net.AndroidClientHandler.WriteRequestContentToOutput (System.Net.Http.HttpRequestMessage request, Java.Net.HttpURLConnection httpConnection, System.Threading.CancellationToken cancellationToken) [0x0009a] in <2bd1b8f6e97f44bbb32ce356b78d4ce6>:0
at Xamarin.Android.Net.AndroidClientHandler.DoProcessRequest (System.Net.Http.HttpRequestMessage request, Java.Net.URL javaUrl, Java.Net.HttpURLConnection httpConnection, System.Threading.CancellationToken cancellationToken, Xamarin.Android.Net.AndroidClientHandler+RequestRedirectionState redirectState) [0x002f4] in <2bd1b8f6e97f44bbb32ce356b78d4ce6>:0
at Xamarin.Android.Net.AndroidClientHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x002cf] in <2bd1b8f6e97f44bbb32ce356b78d4ce6>:0
at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in <c85119bf7e3e421490ae6b5487992fff>:0
at BB.App.Services.WebserviceHelper.PostToWebservice[T] (System.String url, System.String json) [0x0008d] in C:\_Sources\_BB\BB.App\BB.App\Services\WebserviceHelper.cs:74
当执行以下代码时会发生这种情况:
await httpClient.SendAsync(httpRequest);
我发现 this site 建议不要将 HttpClient 的创建放在 using 语句中,我更改了它,但它没有解决我的问题。
我还发现了应该在去年修复的this bug。老实说,这听起来像是最有可能的候选人,但我不知道要更新什么才能在我的电脑上得到这个修复。我已经在我的解决方案中更新了我所有的 xamarin.android.x 引用,但到目前为止还没有运气。
【问题讨论】:
哪个HttpClient have you specified in Android project properties? @magicandre1981 我不知道你的意思,在“应用程序”下我选择了使用 android 版本 8.1 (oreo) 编译。在“android manifest”下,我选择了 Android 5.0(api 级别 27 棒棒糖)作为最低 android 版本,对于目标 android 版本,我选择了 Android 8.1 啊,现在我看到你发布了一个链接。嗯.. 'Android' 的推荐设置已激活。当我将其更改为“管理”时,我的问题就消失了。非常感谢! 您在发生崩溃的设备上使用哪个 Android 版本以及您的项目针对哪个 API 版本?通常你应该使用 AndroidClientHandler 不要丢弃 HttpClient。它旨在被重用并处理多个同时请求。检查***.com/questions/50991291/… 【参考方案1】:总之,解决我的问题的原因是
进入android项目的属性, 选择“android 选项”选项卡, 点击“高级” 将“httpclient implementation”从“Android”设置为“Managed”【讨论】:
以上是关于HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有的主要内容,如果未能解决你的问题,请参考以下文章
HttpClient.SendAsync:500 - Windows 服务应用程序中的内部服务器错误
HttpClient.SendAsync 方法退出而不抛出异常
HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有