using Native AndroidMessageHandler throws System.ObjectDisposedException: Cannot access a closed Stream. on MAUI

Viewed 44

I am doing an http request so if I used the default self signed credentials i had issues and couldn't make the request so I override it

I am doing a post request within my local network so I have used the following code to override the behaviour to check the credentials

#if DEBUG
        var httpHelper = new HttpClientHandlerHelper();
 builder.Services.AddSingleton<HttpClient>(x=> new HttpClient(httpHelper.GetInsecureHandler(), false));

#else
        builder.Services.AddSingleton<HttpClient>();
#endif

where it is defined as

 public CustomAndroidMessageHandler GetInsecureHandler()
 {
        var handler = new CustomAndroidMessageHandler();
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
        {
            // if (cert.Issuer.Equals("CN=localhost"))
            return true;
        };
        return handler;
    }

and the Android handler

 public class CustomAndroidMessageHandler : AndroidMessageHandler
    {
        protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
            => new CustomHostnameVerifier();

        private sealed class CustomHostnameVerifier : Java.Lang.Object, IHostnameVerifier
        {
            public bool Verify(string hostname, ISSLSession session)
                => HttpsURLConnection.DefaultHostnameVerifier.Verify(hostname, session)
                    || (hostname == "192.168.250.3" && session.PeerPrincipal.Name == "CN=localhost");
        }
    }

at the moment of calling httpClient.PostAsync() with the Native handler it throws

System.ObjectDisposedException: Cannot access a closed Stream.
   at System.IO.MemoryStream.EnsureNotClosed()
   at System.IO.MemoryStream.get_Length()
   at System.Net.Http.HttpContent.GetComputedOrBufferLength()
   at System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()
   at Xamarin.Android.Net.AndroidMessageHandler.SetupRequestBody(HttpURLConnection httpConnection, HttpRequestMessage request) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 1132
   at Xamarin.Android.Net.AndroidMessageHandler.SetupRequestInternal(HttpRequestMessage request, URLConnection conn) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 984
   at Xamarin.Android.Net.AndroidMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 374
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at MauiAppTest.Common.Services.ChatServicesService.CreateUser(String phoneNumber) in C:\Users\PontiacGTX\Source\Repos\MauiAppTest\Common\Services\MainService.cs:line 38}

using the HttpClientHandler

also using HttpClientHandler gives this exception System.ObjectDisposedException: Cannot access a closed Stream.
   at System.IO.MemoryStream.EnsureNotClosed()
   at System.IO.MemoryStream.get_Length()
   at System.Net.Http.HttpContent.GetComputedOrBufferLength()
   at System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()
   at Xamarin.Android.Net.AndroidMessageHandler.SetupRequestBody(HttpURLConnection httpConnection, HttpRequestMessage request) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 1132
   at Xamarin.Android.Net.AndroidMessageHandler.SetupRequestInternal(HttpRequestMessage request, URLConnection conn) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 984
   at Xamarin.Android.Net.AndroidMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 374
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at AppTest.Common.Services.ChatServicesService.CreateUser(String phoneNumber) in C:\Users\PontiacGTX\Source\Repos\MauiAppTest\Common\Services\MainService.cs:line 38
0 Answers
Related