HttpClient 和 PushStreamContent

2023-11-24

我将 PushStreamContent 与 REST API (ASP.NET Web API) 结合使用,效果非常好。 HttpClient 可以在服务器处理完整请求之前请求资源并获取 HTTP-Response(服务器仍然写入推送流)。

作为 HttpClient,您必须做一件小事:使用 HttpCompletionOption.ResponseHeadersRead。

现在我的问题是: 是否有可能以其他方式做到这一点? 从 HttpClient -> 通过推送流将数据上传到 Web api?

我按如下方式实现它,但 Web api 不会在客户端关闭流之前获取请求。

         var asyncStream = new AsyncStream(fs);
         PushStreamContent streamContent = new PushStreamContent(asyncStream.WriteToStream);
         content.Add(streamContent);

         HttpResponseMessage response = await c.SendAsync(new HttpRequestMessage(new HttpMethod("POST"), "http://localhost/...") { Content = content }, HttpCompletionOption.ResponseHeadersRead);

         response.EnsureSuccessStatusCode();

AsyncStream 是我的委托类:

public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)

这对于推送流来说是必要的。

这有可能吗?在最后一个字节写入流之前,HttpClient 不会将请求发送到 Web api...

我需要做什么?问题是在客户端还是在服务器/asp.net web api 端?

编辑: 这是 WriteToStream 的实现(但我不使用磁盘中的文件,而是使用内存流“memoryStream”(在构造函数中传递):

public void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
    try
    {
        var buffer = new byte[4096];

        using (var stream = myMemoryStream)
        {
            var bytesRead = 1;

            while (bytesRead > 0)
            {
                bytesRead = video.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            }
        }
    }
    catch (HttpException ex)
    {
        return;
    }
    finally
    {
        outputStream.Close();
    }
}

也许我必须做一些事情: HttpContent 内容, TransportContext 上下文?


我找到了解决我的问题的方法:

我想设置: httpWebRequest.AllowReadStreamBuffering = false;

HttpClient 4.0 默认情况下会进行缓冲,并且您无法访问属性AllowReadStreamBuffering,因此您必须直接使用HttpWebRequest。 (或者您可以使用 HttpClinet 4.5,有默认行为“流”)请参阅:http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/6.使用HttpClient)

第二个问题是 fiddler:Fiddler 目前仅支持响应流而不支持请求(Fiddler 使 HttpWebRequest/HttpClient 行为出现意外)

对我有用的解决方案:

HttpWebRequest httpWebRequest = HttpWebRequest.Create(...)
httpWebRequest.Method = "POST";
         httpWebRequest.Headers["Authorization"] = "Basic " + ...;
         httpWebRequest.PreAuthenticate = true;
         httpWebRequest.AllowWriteStreamBuffering = false;
         httpWebRequest.AllowReadStreamBuffering = false;
         httpWebRequest.ContentType = "application/octet-stream";
         Stream st = httpWebRequest.GetRequestStream();
st.Write(b, 0, b.Length);
st.Write(b, 0, b.Length);
//...
         Task<WebResponse> response = httpWebRequest.GetResponseAsync();

         var x = response.Result;
         Stream resultStream = x.GetResponseStream();
//... read result-stream ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient 和 PushStreamContent 的相关文章

随机推荐

  • 如何检查 vector 是否实际上是位向量而不是字节向量?

    我需要存储动态的位数组 关于向量 的 C 参考页有以下信息 存储不一定是数组bool值 但库实现可以优化存储 以便每个值都存储在单个位中 我如何确保我的程序使用vector
  • 带有视频源的 HTML5 Canvas drawImage 无法在 Android 上运行

    我正在尝试使用画布drawImage方法与视频源 但它不适用于Android 4 4 2 用Chrome浏览器测试 这是我的代码 function var canvas document getElementById canvas var
  • Angular2 - 成功登录后重定向到调用网址

    我已经使用 Angular 2 1 0 启动并运行了我的应用程序 路由通过路由器守卫 canActivate 进行保护 当将浏览器指向 localhost 8080 customers 等受保护区域时 我会像预期一样重定向到我的登录页面 但
  • Java 9,ClassLoader.getSystemClassLoader 的兼容性问题

    以下代码将 jar 文件添加到构建路径 它在 Java 8 中工作正常 但是 它在 Java 9 中抛出异常 该异常与 URLClassLoader 的强制转换有关 有什么想法可以解决这个问题吗 最佳解决方案是将其编辑为适用于 Java 8
  • 将 location.pathname 和 location.search 设置在一起?

    我想做类似的事情 location pathname abc location search name test 它最终被重定向到 abc 我希望重定向发生 abc name test 只需设置location or location hr
  • 如何将图像大小缩小到1MB

    我希望我的应用程序上传图像没有大小限制 但在代码中 如果图像大小超过 我想将图像大小调整为 1MB 我尝试了很多方法 但找不到满足上面提到的要求的任何代码 这一次 我尝试过这个 public void scaleDown int width
  • jQuery 在选定的收音机上添加/删除 css 类

    我已经在这里阅读了一些解决方案 但我的问题非常不同 这些解决方案不起作用 基本上 如果单选按钮被选中 则向父 div 添加一个 css 类 如果未选中无线电 请删除 css 类 听起来很简单 我有多个单选按钮组 因此换句话说 一次会选择多个
  • PIC16 C 编译器

    我正在为 PIC 16 系列寻找一个在 Windows 上运行的优秀 C 编译器 几个同事使用bknudc但有些人似乎不喜欢它 显然你无法有效地使用链接器 事实证明最好的方法是将所有代码设置在包含文件中 SDCC看起来不错 但看起来它仍处于
  • dart,单元测试私有方法

    我有一个相当大的库 但只公开了一个非常小的 API 以方便新用户使用和学习 我想以这种方式保留我的库 但我也想确保我有尽可能多的单元测试覆盖率 我希望能够直接对我的所有课程进行单元测试 但据我所知我可以仅对库的公共 API 进行单元测试 当
  • 使用 Qunit 断言函数抛出异常

    我是 Qunit 和单元测试的新手 我试图弄清楚测试以下功能的内容和方法 目前它没有做太多事情 但我想断言 如果我传递错误的值 则会抛出错误 function attrToggle panel attr use strict if pane
  • 字符串的 OCaml 函数参数模式匹配

    我尝试传递一个字符串来获取反转的字符串 为什么我不能这样做 let rec reverse x match x with gt e s gt reverse s e 编译器说这是一个语法错误 我不能用吗 解构参数 原因是字符串不像列表那样表
  • Visual C++ 中的 Pthread

    我正在 Windows 中尝试多线程 想知道是否应该 use Win32 API use Windows 的 POSIX 线程 如果我尝试在不同平台上开发此类应用程序 学习 Pthreads 将很有用 但如果不学习 Win32 API 我会
  • 在 Android 嵌套 PreferenceScreen 上显示向上/后退按钮?

    我有一个两级 PreferenceScreen
  • 带有等号和空格的 Python 子进程参数

    我正在尝试运行命令subprocess check output不使用shell True关键字参数 我的命令是这样的 command parameter something with spaces 有了这个 subprocess chec
  • 按钮的 jQuery Datatable DOM 定位

    我刚刚将 jQuery Datatable 版本升级到 1 10 然后我尝试删除其已退役的插件 例如带有 Button 扩展名的 Colvis 和 Tabletools 这里一切正常 但对我来说问题是 我无法将 Colvis 按钮与 Tab
  • 我的自定义异常应该继承与它们类似的异常还是仅从 Exception 继承?

    我正在我的应用程序中创建一些自定义异常 如果我在测试参数状态后抛出异常 或者在测试 int 在正确范围内后抛出异常 那么我的异常应该继承 ArgumentException 和 IndexOutOfRangeException 还是应该继承
  • 运行 GAE devserver 时,jsessionID 会附加到 url

    由于某种原因 字符串如下 jsessionid SESSION HERE当我访问部署到 GAE 开发服务器的应用程序时 它会被添加到网址中 这会让事情变得混乱 因为对于某些 url 来说 它根本无法解析为 GET 参数 有时它最终会出现这样
  • 可变长度 rnn 填充和屏蔽填充梯度

    我正在构建一个 rnn 并使用 sequene length 参数来提供批次中序列的长度列表 并且批次中的所有序列都填充到相同的长度 然而 在进行反向传播时 是否可以屏蔽掉与填充步骤相对应的梯度 从而使这些步骤对权重更新的贡献为 0 我已经
  • 如何用另一个 JPanel 替换 JPanel

    我想用 JFrame 中的另一个 Jpanel 替换 Jpanel 我已经搜索并尝试了我的代码 但什么也没发生 这是我的代码 public class Frame extends JFrame private Container conta
  • HttpClient 和 PushStreamContent

    我将 PushStreamContent 与 REST API ASP NET Web API 结合使用 效果非常好 HttpClient 可以在服务器处理完整请求之前请求资源并获取 HTTP Response 服务器仍然写入推送流 作为