在.网络核心中使用HttpClient进行表单提交出现错误如何解决

  介绍

这期内容当中小编将会给大家带来有关在。网络核心中使用HttpClient进行表单提交出现错误如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>问题#

在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据。在微信支付接口文档也说明了,需要使用多部分/格式的方式发送请求. .净提供了MultipartFormDataContent类型,帮助我们构建表单请求,故有以下代码:

var  form =, new  MultipartFormDataContent ()   {   {才能new  StringContent (“Value"),“名称},   {才能new  ByteArrayContent (new  byte[]{}/*模拟文件数据*/),“文件,“文件名}   }

按照微信支付官方文档提交之后,一直提示参数错误,百思不得其解。

<强>原因#

通过邮差模拟表单提交,捕获数据包,将其与c#的提交代码进行对比,发现了两处问题。

邮差的原始提交:

文章http://api.mch.weixin.qq.com/secapi/mch/uploadmedia HTTP/1.1
user - agent: PostmanRuntime/7.21.0
接受:*/*
cache - control: no - cache
Postman-Token: b6800c0f - 3 - f16 - 4981 b661 e6d16fc1bb1e
主持人:api.mch.weixin.qq.com
- type:多部分/格式;边界=- - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377
接受编码:gzip、缩小
内容长度:566
连接:维生

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377
附加项:格式;name=癿ch_id"

1565111111
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377
附加项:格式;name=癿edia_hash"

7215 e92a8f3f3d0256484efff53a25f6
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377
附加项:格式;name=皊ign_type"

HMAC-SHA256
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377
附加项:格式;name=皊ign"

A1D8B094FA24BE5531D1AC198DE25550
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 639275760242036520206377——

c#代码的提交:

文章http://api.mch.weixin.qq.com/secapi/mch/uploadmedia HTTP/1.1
主持人:api.mch.weixin.qq.com
- type:多部分/格式;边界=癳9d5712f - 7923 - 4 - ec5 - 8 bf3 c8d5d3cd3217"
内容长度:502

——e9d5712f - 7923 - 4 - ec5 - 8 bf3 - c8d5d3cd3217
内容类型:文本/平原;utf - 8字符集=
附加项:格式;name=mch_id


——e9d5712f - 7923 - 4 - ec5 - 8 bf3 - c8d5d3cd3217
内容类型:文本/平原;utf - 8字符集=
附加项:格式;name=media_hash 33 f15bc2d17d6ffbc18fa566ef65722e


——e9d5712f - 7923 - 4 - ec5 - 8 bf3 - c8d5d3cd3217
内容类型:文本/平原;utf - 8字符集=
附加项:格式;name=符号

1 e377684f9bd583d2ed26fb367916c0c
——e9d5712f - 7923 - 4 - ec5 - 8 bf3 - c8d5d3cd3217——

<强> 1。边界的双引号

使用MultipartFormDataContent提交的表单请求,外部内容类型的边界值带有“号。而邮差提交的表单请求,它的边界值是没有双引号的。

那为什么会造成这样的差异呢?参考这篇博客的讲解,是由于各个系统/语言针对RFC 2046的实现不一致导致的。针对于MultipartFormDataContent的行为,如果边界后面的值带有双引号是符合标准的。

RFC 2612原文:

2)尽管RFC 2046[40]允许边界字符串
引用,一些现有的实现处理边界
引用字符串不正确。

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

<强> 2。表单内键值对,值的双引号

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

<>强解决#

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

针对问题一,其内部的ContentType。参数,通过LINQ找到边界的键值对,替换内部的双引号即可。

var  boundaryValue =, form.Headers.ContentType.Parameters.Single (p =祝辞,p.Name ==,“boundary");   时间=boundaryValue.Value  boundaryValue.Value.Replace (“\““,, String.Empty);

在.网络核心中使用HttpClient进行表单提交出现错误如何解决