使用正文执行 POST 时,HttpClient .NET MAUI 中出现错误

问题描述 投票:0回答:1

我的 .NET Maui 应用程序有问题,因此我有一个 HttpService 类,我可以在其中轻松获取 Post/Get 请求的响应。但是,当在本地 Android 设备上运行我的应用程序并执行“发布”并获得正文时,我收到此错误:

    {System.ObjectDisposedException: Cannot access a closed Stream.
   at System.IO.MemoryStream.EnsureNotClosed()
   at System.IO.MemoryStream.CopyToAsync(Stream destination, Int32 bufferSize, CancellationToken cancellationToken)
   at Xamarin.Android.Net.AndroidMessageHandler.WriteRequestContentToOutput(HttpRequestMessage request, HttpURLConnection httpConnection, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 458
   at Xamarin.Android.Net.AndroidMessageHandler.DoProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 533
   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 375
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at MyApp.Services.HttpService.PostAsync(String url, String body, String token, Dictionary`2 headers) in C:\Users\user\Documents\temp\MyApp\MyApp\Services\HttpService.cs:line 38}

这是我的方法:

public async Task<string> PostAsync(string url, string body = "", string? token = "", Dictionary<string, string> headers = null)
    {
        HttpClient client = new();
        try
        {
            var request = new HttpRequestMessage(HttpMethod.Post, url)
            {
                Content = new StringContent("", Encoding.UTF8, "application/json"),
            };

            if (headers != null)
            {
                foreach (var header in headers)
                {
                    request.Headers.Add(header.Key, header.Value);
                }
            }

            if (token != "") request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);


            var result = await client.PostAsync(url, new StringContent("", Encoding.UTF8, "application/json"));
            //var result = await client.SendAsync(request);

            var test = await result.Content.ReadAsStringAsync();

            if (result.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception("Något gick fel");
            }

            return await result.Content.ReadAsStringAsync();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

我尝试过“SendAsync”和“PostAsync”,但它们都不起作用。但是如果我发送 HttpRequestMessage 并注释掉“Content = ...”部分,SendAsync 就会起作用。

如果我在 Windows 机器上调试它,它可以完美运行。不幸的是,我没有更多的 Android 设备来测试它。我将尝试模拟器并写出结果。

**模拟器上的结果相同。

c# android .net maui
1个回答
0
投票

请参阅下面使用 httpclient 的 dotnet maui Post 请求的示例代码

     var client = new HttpClient();
 var content = new StringContent($"{{\"image\":\"{image}\"}}", Encoding.UTF8, "application/json");
 var response = await client.PostAsync(APIrootUrl + UpdateDriverFaceApi, content);

 if (response.IsSuccessStatusCode)
 {
     return response.ReasonPhrase;
     // Handle success
 }
 else
 {
     return "Failed";
 }
© www.soinside.com 2019 - 2024. All rights reserved.