HttpClient.SendAsync在Xamarin.Forms Android上抛出ObjectDisposedException,但在UWP上没有抛出

ekqde3dh  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(120)

我正在编写一个Xamarin.Forms应用程序,并尝试使用JSON负载向Web服务器进行Post。
这在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,它建议不要在using语句中创建HttpClient,我对此进行了修改,但它没有解决我的问题。
我还发现了去年应该被修复的this bug。老实说,这听起来像是最有可能的候选者,但我不知道确切地说,我不知道该更新什么才能在我的电脑上得到这个修复。我已经更新了我的解决方案中所有的xamarin.android.x引用,但到目前为止还没有运气。

thtygnil

thtygnil1#

所以总结一下,解决我问题的方法是

  • 转到android项目的属性,
  • 选择“android选项”标签,
  • 单击“高级”
  • 将“httpclient实现”从“Android”设置为“托管”
lyr7nygr

lyr7nygr2#

对于那些还在苦苦挣扎甚至几乎找不到这个线程的人来说,如果接受的答案对你不起作用,尝试设置disposeHandler = false;如在新HttpClient中(处理程序,false);例如

public AppState()
    {
        HttpClientHandler handler = new HttpClientHandler();
        handler.UseDefaultCredentials = true;
        http = new HttpClient(handler, false) { BaseAddress = new Uri("url") };
    }
t3irkdon

t3irkdon3#

另一个选项(假设您没有处理HttpClient)是您的服务器正在重定向,例如从http到https。
即使服务器证书有效,HttpClient在尝试SendAsync时也会引发ObjectDisposedException: Cannot access a closed Stream.异常。
如果可以,解决方案是“修复”重定向,例如,对于.NET核心开发Web服务器,不要调用UseHttpsRedirection()

相关问题