Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException

Posted

技术标签:

【中文标题】Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException【英文标题】:Xamarin Forms HttpClient PostAsync always throw NSMallocException 【发布时间】:2021-11-22 10:38:01 【问题描述】:

我们正在使用 Xamarin Forms 5 和 Visual Studio 2022 为 iosandroid 构建一个移动应用程序。当我们向任何 api 发出 Post 请求时,我们总是返回我们自己的外部 api:

Xamarin.PreBuilt.iOS[3728:2199180] Xamarin.iOS: Received unhandled ObjectiveC exception: NSMallocException Failed to grow buffer

GET 请求工作正常。我搜索了 Google 和 ***,但找不到任何帮助。我试图增加 HttpClient.MaxResponseContentBufferSize 没有任何区别。

目前的应用程序非常简单,一页有一个按钮来测试。后面的代码如下:

public partial class MainPage : ContentPage
    
        public MainPage()
        
            InitializeComponent();
        

        private async void Button_Clicked(object sender, EventArgs e)
        
            var client = new HttpClient();
            client.BaseAddress = new Uri("https://ptsv2.com/");

            string jsonData = @"";

            var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync("/t/l4x2e-1637576441/post", content);

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

这在 iOS 链接设备上失败,但对于 Android 模拟器它可以工作。我需要针对 iOS 进行更改吗?

更新

代码在除我之外的多台机器上工作,试图弄清楚这可能是什么设置,任何想法将不胜感激。

【问题讨论】:

您在 VS 输出窗格中看到该异常之后的堆栈转储吗?如果是这样,请将堆栈转储添加到您的问题中。谷歌表明这有时是 ios 上各种库的问题。我看到的唯一具体原因是内存不足。谷歌Received unhandled Objective C exception: NSMallocException Failed to grow buffer 尝试在 PostMan 中执行相同的请求。这有时会给出更丰富的回应。具体与此错误无关,但有时在末尾添加 / 可以避免重定向。 (重定向可能会丢失正文 json 内容)"/t/l4x2e-1637576441/post/" 您的代码看起来完全正确,我用VS 2022 , Xamarin.Forms 5 , iPhone12 simulator , iOS 15.0 测试,它工作正常,没有任何错误。 @ColeX-MSFT,感谢您的测试,知道什么设置会影响这个吗?我在多部 iPhone 上进行了测试。 这是内存溢出错误,您的 iPhone 规格是什么?如果它太旧(例如 iPhone5),它可能会引发错误,因为它的内存量较少,请在较新的 iPhone 上尝试。 【参考方案1】:

我遇到了完全相同的问题,并且在 VS 反馈论坛上与 Microsoft 记录了一张票。然后今天我找到了一个简单的解决方法。至少我认为这是一种解决方法,而不是解决方案。我在哪里

HttpClient client = new HttpClient() 

我改为这样做:

var handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);

还有宾果游戏,现在可以了。

【讨论】:

感谢它也对我有用 :) 也为我工作。如果 Microsoft 提供更多信息,您能否更新此答案? 会的。自 2021 年 12 月 8 日以来,它一直在与微软进行“调查”。

以上是关于Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient 非常慢 - Xamarin Forms

Xamarin.Forms 上的 HttpClient PostAsync 失败(状态码:404)

HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有

Xamarin Forms Fusillade Refit - 使用单个 HttpClient 实例

Xamarin Forms 使用 httpclient 下载 json 文件:ReadAsStringAsync 还是 DownloadFileAsync?

Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException