.NET Core使用HttpClient进行表单提交时遇到的问题

2020-01-18 19:39:27王冬梅

RFC 2612 原文:

2) Although RFC 2046 [40] permits the boundary string to be
quoted, some existing implementations handle a quoted boundary
string incorrectly.

Boundary 的作用,是一个随机生成的字符串,在 HTTP 协议当中用于分割内部多个 Content。为什么是随机生成的呢?就是防止这个分割符跟你内部的 Content 产生重复造成意外。(C# 默认使用的是 Guid 作为随机串,你也可以在构造 MultipartFormDataContent 的时候,通过其构造函数手动指定)

2. 表单内键值对,值的双引号

第二个问题则是表单内的内容,他们的 name 键值对,其值又没有双引号,所以你得在添加 Content 的时候,得手动指定双引号。

解决#

两个问题都是由于双引号导致的,所以只需要在真正发起调用之前将内部的双引号替换为空,或者将缺失的双引号添加上即可。

针对问题一,其内部的 ContentType.Parameters ,通过 LINQ 找到 boundary 的键值对,替换内部的双引号即可。


var boundaryValue = form.Headers.ContentType.Parameters.Single(p => p.Name == "boundary");
boundaryValue.Value = boundaryValue.Value.Replace(""", String.Empty);

针对问题二,在构造内部 Content 的时候,其 Name 手动赋予双引号。


var form = new MultipartFormDataContent
{
  {new StringContent(mchId), ""mch_id""},
  {new ByteArrayContent(bytes), "media", $""{HttpUtility.UrlEncode(Path.GetFileName(imagePath))}""},
  {new StringContent(mediaHash), ""media_hash""},
  {new StringContent(sign), "sign"}
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。