【问题标题】:POST body null when performing PostMultipartAsync执行 PostMultipartAsync 时 POST body null
【发布时间】:2020-08-13 15:58:36
【问题描述】:

深入研究使用 flurl 向客户端服务器发送多部分 POST 调用。不幸的是,他们的服务器对我们来说是一个黑匣子。我收到了 400 条回复,带有一条通用消息,所以在我对它们进行错误处理之前,我需要覆盖我的所有基础。

执行这样的调用:

string s = await "https://clientservier.com/cgi-bin/perl-script"
    .PostMultipartAsync(mp => mp
        .AddString("DisplayActive", "IsDisplayed")
        .AddString("ControlTypeHidden", "ALL")
        .AddString("QueryHidden", "KEYs")
        .AddString("dump_app_trace", "false")
        .AddString("db_debug", "false")
        .AddString("Get Data", "Get Data"))
    .ReceiveString();

如果我在 BeforeCall 事件上附加一个处理程序,并查看 HttpCall 对象,我的变量会按预期列在 Request.Content.Parts 中。但是,RequestBody 为空 - 我想查看发送的请求的字符串输出,类似于:

-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="DisplayActive"

IsDisplayed
-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="ControlTypeHidden"

ALL
-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="QueryHidden"

KEYs
-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="Get Data"

Get Data
-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="dump_app_trace"

false
-----------------------------13377838992432022416720759
Content-Disposition: form-data; name="db_debug"

false
-----------------------------13377838992432022416720759--

(显然,是的,边界会有所不同,这只是一个浏览器示例。) 有趣的是,当调用返回 400 时,AfterCall 事件处理程序在对象中没有上述部分,所以我想知道在进行此调用之前是否忘记做某事。

【问题讨论】:

  • 会问为什么投反对票,以帮助改善我的问题,但我很确定这只是一个巨魔。

标签: c# flurl


【解决方案1】:

在这种情况下RequestBody 为 null 绝对不直观。在 HttpClient 堆栈中,请求主体基本上是一次读取的流,如果您需要进行诊断,则很难将其作为字符串读回。 Flurl 基本上说,是的,在大多数典型情况下,这可能是一种微优化,例如请求正文不会很大的 JSON 或 URL 编码的 POST。因此,它在内部使用了一种名为CapturedStringContent 的类型,它只是将字符串“捕获”到构造时的属性中。事件处理程序使用它来公开 RequestBody 属性。

但是多部分请求更可能是大的,并且在字符串中捕获请求主体可能是一个合法的内存问题。所以这里使用的类型不是从 CapturedStringContent 派生的,因此你不能轻易地将 body 作为字符串。

至于为什么Parts 为空,HttpClient(Flurl 构建在其之上)disposes 在发送请求后自动将HttpContent 对象。奇怪的是(在我看来),这清除了 Parts 来自的基础集合,我在 source 中确认了这一点。

话虽如此,您的代码对我来说看起来不错,我毫不怀疑它正在按照您的期望进行。但如果你想绝对确定,我建议使用像 Fiddler 或 Wireshark 这样的网络嗅探器。

【讨论】:

  • 好的,这是有道理的,因为多部分通常用于二进制文件。我可能会得到 Wireshark 并偷看一下——尽管我仍然担心 AfterCall 事件中的“部分”是空的——这也让我有点担心。
  • 调用后零件为空的有趣点。我什至不知道这种行为,但我弄清楚了原因并更新了答案。我可能会想出一种方法让 Flurl 确保它不会丢失它。随时记录问题,我认为这将是一个很好的改进。
  • 会做的,也感谢您的解释。在这种情况下,我还有其他事情要做,需要客户的帮助。谢谢!
猜你喜欢
  • 2020-02-09
  • 2021-04-10
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2015-01-25
相关资源
最近更新 更多