System.Net.Http.HttpClient 是否受到 HttpWebRequest.AllowWriteStreamBuffering 的影响?

2024-03-22

我一直在尝试使用System.Net.Http.HttpClient发布更大的文件(+1GB),但它会抛出SystemOutOfMemory例外:

at System.Net.ScatterGatherBuffers.AllocateMemoryChunk(Int32 newSize)
at System.Net.ScatterGatherBuffers..ctor(Int64 totalSize)
at System.Net.ConnectStream.EnableWriteBuffering()
at System.Net.HttpWebRequest.SetRequestSubmitDone(ConnectStream submitStream)
at System.Net.Connection.CompleteStartRequest(Boolean onSubmitThread, HttpWebRequest request, TriState needReConnect)
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
at System.Net.Http.HttpClientHandler.StartGettingRequestStream(RequestState state)
at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)

显然,类似的问题也发生在HttpWebRequest正如这里所讨论的:http://support.microsoft.com/kb/908573 http://support.microsoft.com/kb/908573.

有什么办法可以设置吗AllowWriteStreamBuffering底层网络请求的false?我找不到任何。

Cheers,


只是为了节省其他感兴趣的人的时间,我正在回答我自己的问题。

经过几次测试后,异常似乎与以下问题相同HttpWebRequest正如问题中所讨论的。我使用 Microsoft.AspNet.WebApi 版本 4.0.20710.0。

下面是两段等效的代码;前者在大文件上失败,而后者则工作正常。

顺便说一句,尽管存在整体利益问题HttpClient变得非常明显:-)


using HttpClient

var clientRef = new System.Net.Http.HttpClient(
    new HttpClientHandler()
    {
        Credentials = new System.Net.NetworkCredential(MyUsername, MyPassword)
    });
clientRef.BaseAddress = new Uri(serverAddress);
clientRef.DefaultRequestHeaders.ExpectContinue = false;
clientRef.PostAsync(
    MyFavoriteURL,
    new System.Net.Http.StreamContent(inputStream)).ContinueWith(
        requestTask =>
        {
            HttpResponseMessage response = requestTask.Result;
            response.EnsureSuccessStatusCode();
        }, TaskContinuationOptions.LongRunning).Wait();

using HttpWebRequest

// Preauthenticate
var req  = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(MyFavoriteURL);
req.Credentials = new System.Net.NetworkCredential(MyUsername, MyPassword);
req.Method = "POST";
req.PreAuthenticate = true;
req.Timeout = 10000;
using (var resp = (System.Net.HttpWebResponse)req.GetResponse())
{
     if (resp.StatusCode != System.Net.HttpStatusCode.Accepted && resp.StatusCode != System.Net.HttpStatusCode.OK)
     {
         throw new Exception("Authentication error");
     }
}

// Upload
req = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(MyFavoriteURL);
req.Credentials = new System.Net.NetworkCredential(MyUsername, MyPassword);
req.Method = "POST";
req.PreAuthenticate = true;
req.Timeout = 1200000;
req.ContentLength = inputStream.Length;
req.ContentType = "application/binary";
req.AllowWriteStreamBuffering = false;
req.Headers.ExpectContinue = false;
using (var reqStream = req.GetRequestStream())
{
    inputStream.CopyTo(reqStream);
}

using (var resp = (System.Net.HttpWebResponse)req.GetResponse())
{
    if (resp.StatusCode != System.Net.HttpStatusCode.Accepted && resp.StatusCode != System.Net.HttpStatusCode.OK)
    {
        throw new Exception("Error uploading document");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Net.Http.HttpClient 是否受到 HttpWebRequest.AllowWriteStreamBuffering 的影响? 的相关文章

  • 为什么在此实例中 System.MidpointRounding.AwayFromZero 不进行舍入?

    在 NET 中 为什么System Math Round 1 035 2 MidpointRounding AwayFromZero 产量 1 03 而不是 1 04 我觉得我的问题的答案就在标有 来电者须知 的部分中http msdn m
  • 如何查找包含nunit测试的dll文件

    我有一个包含许多 dll 的文件夹 其中之一包含 nunit 测试 标有 Test 属性的函数 我想从 C 代码运行 nunit 测试 有什么办法可以找到正确的dll吗 谢谢 您可以使用程序集加载文件 http msdn microsoft
  • 使用 Windbg 调试 .NET 转储

    我对 NET 进程进行了转储 使用 ma 选项和 procdump exe 中的高 CPU 触发器 并且希望在正在运行的线程中查看有关我的代码正在执行的操作的线索 我明白了 procdump ma c 65 s 2 n 3 service
  • 在 TaskCompletionSource.Task(已调用 .SetResult)上调用ContinueWith 方法是否安全?

    使用是否安全ContinueWith 上的方法TaskCompletionSource Task if the TaskCompletionSource SetResult 已经被调用了 这个基本代码有望有助于解决这个问题 this was
  • 强制 Excel 将多张纸作为单个作业打印

    在某些 Excel 2003 工作簿中 当我尝试print如果有多个工作表 Excel 将这些工作表视为单独的打印作业 这让我一直在编写的 Excel 自动化应用程序感到困惑 因为它会导致 Adob e PDF Printer 停止并询问用
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 接口中的私有成员

    是否可以在 NET 接口中创建私有成员 我听说现在可以了 但我的 IDE 拒绝了 public interface IAnimal void SetDefaultName string name ChangeName name privat
  • 当“多次安装 MSBuild”时,Dotnet 项目转换尝试转换失败

    try convert w Test csproj target framework netstandard2 0 结果是 Multiple installs of MSBuild detected please select one In
  • 以编程方式创建类似 Visio 的图表 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要以编程方式创建类似于 Visio 的图表作为绘图 大多数情况下 我们将创建与此类似的网络布局图o
  • 创建序列的幂集

    我正在尝试创建一个程序 作为创建序列 字符串或数字的可能组合的基础 这是某种加密 解密程序 我正在使用 Visual Studio 2013 和 C 我想做的是从序列中生成幂集 但我有点困惑并且无法继续进行 这是代码 public stat
  • 向父进程发出信号,表明子进程已完全初始化

    我正在启动一个公开 WCF 端点的子进程 如何从子进程向父进程发出信号 表明子进程已完全初始化并且现在可以访问端点 我曾考虑过使用信号量来实现此目的 但不太清楚如何实现所需的信号 string pipeUri net pipe localh
  • 将多对多关系与实体框架中的属性映射

    我总是使用属性将实体的属性映射到相应的列 这是一个例子 Table news entries public class News Key public int Id get set Column d date public DateTime
  • 我们如何从 getschemaTable 获取列大小和数据类型?

    我是一个新手 我试图从数据库中的某个表中检索列名称 大小 最大长度 和数据类型 当我执行以下代码时 希望它显示所有列类型和名称 我没有找到如何引用 Size 我使用了 ColumnSize 但据说 DataColumn 不包含此方法的定义
  • 强制发送带有请求的根 CA

    我们有第三方 API 提供商提供 SOAP API 他们提供了3个证书 客户证书 中级证书 根证书 所有证书均在本地安装 他们提供了带有密码的 pfx 证书 我们已经在 SOAP UI 工具中上传了这个 pfx 并运行了一个请求 它起作用了
  • 从 SQL XML 列中的元素获取属性名称

    对于此 xml 在 SQL 2005 XML 列中
  • 在 Windows XP 中,SqlCe 在受限用户帐户下打开缓慢

    我有一个使用 NET 4 0 构建的 Windows 应用程序 它的program files目录下有一个SqlCe数据库 C Program Files 公司名称 应用程序名称 Data Data sdf 该应用程序与 Inno Setu
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 托管 ODP.NET 驱动程序未显示在“数据源”对话框中

    在我的计算机上安装托管 ODP NET 后 ODP NET 托管驱动程序没有出现在里面选择数据源Visual Studio 2013 Professional 中的对话框 它应该是这样的 这就是它在我的机器上的实际外观 我已按照 轻松驱动

随机推荐