【问题标题】:The request requires buffering data to succeed HttpClient请求需要缓冲数据才能成功 HttpClient
【发布时间】:2016-11-01 21:13:10
【问题描述】:

我正在尝试使用POST 方法将字典内容发送到服务器

public async Task<T> postConnection(string GETParam, Dictionary<string, string> values, bool isRegistration = false)
{
    HttpResponseMessage response;
    string responseString;
    try
    { 
        using (var client = new HttpClient() { MaxResponseContentBufferSize = 256000 }) 
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tocken);
            var content = new FormUrlEncodedContent(values);
            response = await client.PostAsync(url, content);
            responseString = await response.Content.ReadAsStringAsync();
        }
    }

但是当我运行代码时,它给了我错误
WebException: The request requires buffering data to succeed HttpClient

我不想使用WebRequestWebClient 发出请求,我只想使用HttpClient

question 已经存在,但在尝试发送 head request 时发生相同的异常,表示该问题仅发生在 Xamarin 项目上,但尚未回答该问题。刚才提到他用WebRequest解决了这个问题。

Xamarin.Forms 上的此代码有什么错误?以及如何使用HttpClient 解决?

编辑

完全例外

{System.Net.WebException: The request requires buffering data to succeed.
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x0005e] in /Users/builder/data/lanes/3540/1cf254db/source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1005 
  at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (IAsyncResult iar, System.Func`2 endFunction, System.Action`1 endAction, System.Threading.Tasks.Task`1 promise, Boolean requiresSynchronization) [0x00014] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/threading/Tasks/FutureFactory.cs:550 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 
  at System.Net.Http.HttpClientHandler+<SendAsync>c__async0.MoveNext () [0x003d6] in /Users/builder/data/lanes/3540/1cf254db/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:372 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 
  at System.Net.Http.HttpClient+<SendAsyncWorker>c__async0.MoveNext () [0x000a9] in /Users/builder/data/lanes/3540/1cf254db/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:276 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
  at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 
  at HuraApp.API.Connection`1+<postConnection>d__1[T].MoveNext () [0x0011c] in C:\Users\Nullsky\documents\visual studio 2015\Projects\HuraApp\HuraApp\HuraApp\API\Connection.cs:43 }

【问题讨论】:

  • 您是否设置了正确的权限?
  • @Tinwor 抱歉,但我认为我不需要设置互联网和网络权限,因为Xamarin 会自动将它们添加到Manifest 文件中。
  • 在引发的异常中是否存在 InnerException?另外,什么平台(iOS?Android?)
  • 不,没有InnerException。我在安卓模拟器上运行它。
  • 代替response = await client.PostAsync(url, content);试试response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Post, url) { Content = content }, HttpCompletionOption.ResponseHeadersRead);

标签: c# xamarin.forms


【解决方案1】:

对于您在发出头部请求时链接的相同问题,请参阅下面的链接,其中在 xamarin 论坛中给出了其中一个解决方案,他们在向 Google url 发出 POST 请求 (200) 时遇到了同样的问题。

在这种情况下,解决方案是将 URL 更改为实际页面,而不是重定向。

这是链接Solution for the issue

希望对你有帮助。

【讨论】:

    【解决方案2】:

    根据 HttpWebRequest 的 Mono 源代码,看起来服务器正在发出重定向,而 HttpWebRequest(由 HttpClient 在幕后使用)没有处理该问题。

    我不确定正在使用哪个版本的 Mono 源,但这看起来很可能是候选者: https://github.com/mono/mono/blob/cc3f4c60379c3839dd4259e171bb4539d21f2157/mcs/class/System/System.Net/HttpWebRequest.cs

    该版本在 HttpWebRequest.EndGetResponse 的第 1005 行有一个“抛出”,它与您看到的异常堆栈相匹配。异常中的字符串“请求需要缓冲数据才能成功”来自 HttpWebRequest.Redirect。

    下一步是使用 Fiddler(或类似工具)复制 Xamarin 客户端尝试查看它从服务器获得的响应的确切 POST 消息。

    【讨论】:

      【解决方案3】:

      很遗憾

      var response = await client.PostAsync(url, content);
      

      在完成之前下载整个响应,因此它不使用任何缓冲。唯一的选择是使用,

      var request = new HttpRequestMessage(url);
      request.Content = content;
      var response = await client.SendAsync(request, 
            HttpCompletionOption.ResponseHeadersRead);
      

      HttpCompletionOption.ResponseHeadersRead 选项使HttpClient 在下载标头后从SendAsync 返回。您可以等待阅读内容。

      【讨论】:

        【解决方案4】:

        这是否发生在 iOS 和/或 Android 上?

        我会尝试将 HttpClient 处理程序更改为本机处理程序。这解决了很多问题,涉及很多主题(TLS 是一个很大的问题)。对于 iOS,使用 NSUrlSession 处理程序,对于 Android,尝试使用 AndroidClientHandler。您应该能够将 HttpClient 用于 Xamarin 的所有内容。

        【讨论】:

        • 谢谢!这是在 iOS 中对我有用的唯一选项。不过,Android 甚至可以使用 AndroidClientHandler
        猜你喜欢
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        相关资源
        最近更新 更多