.NET Core使用HttpClient进行表单提交时遇到的问题
 更新时间:2019年12月30日 10:50:29   作者:MyZony  

这篇文章主要介绍了.NET Core使用HttpClient进行表单提交时遇到的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题#

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

var form = new MultipartFormDataContent()
{
{new StringContent(“Value”),”Name},
{new ByteArrayContent(new byte[]{}/*模拟文件数据*/),”File,”FileName}
}

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

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

POST api.mch.weixin.qq.com/secapi/mch/uploadmedia HTTP/1.1
User-Agent: PostmanRuntime/7.21.0
Accept: */*
Cache-Control: no-cache
Postman-Token: b6800c0f-3f16-4981-b661-e6d16fc1bb1e
Host: api.mch.weixin.qq.com
Content-Type: multipart/form-data; boundary=————————–639275760242036520206377
Accept-Encoding: gzip, deflate
Content-Length: 566
Connection: keep-alive
—————————-639275760242036520206377
Content-Disposition: form-data; name=”mch_id”
1565111111
—————————-639275760242036520206377
Content-Disposition: form-data; name=”media_hash”
7215E92A8F3F3D0256484EFFF53A25F6
—————————-639275760242036520206377
Content-Disposition: form-data; name=”sign_type”
HMAC-SHA256
—————————-639275760242036520206377
Content-Disposition: form-data; name=”sign”
A1D8B094FA24BE5531D1AC198DE25550
—————————-639275760242036520206377–

C# 代码的提交:

POST api.mch.weixin.qq.com/secapi/mch/uploadmedia HTTP/1.1
Host: api.mch.weixin.qq.com
Content-Type: multipart/form-data; boundary=”e9d5712f-7923-4ec5-8bf3-c8d5d3cd3217″
Content-Length: 502
–e9d5712f-7923-4ec5-8bf3-c8d5d3cd3217
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=mch_id

–e9d5712f-7923-4ec5-8bf3-c8d5d3cd3217
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=media_hash
33F15BC2D17D6FFBC18FA566EF65722E
–e9d5712f-7923-4ec5-8bf3-c8d5d3cd3217
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=sign
1E377684F9BD583D2ED26FB367916C0C
–e9d5712f-7923-4ec5-8bf3-c8d5d3cd3217–

1. Boundary 的双引号
使用 MultipartFormDataContent 提交的表单请求,外部 Content-Type 的 boundary 值带有 ” 号。而 Postman 提交的表单请求,它的 boudary 值是没有双引号的。
那为什么会造成这样的差异呢?参考 这篇 博客的讲解,是由于各个系统/语言针对 RFC 2046 的实现不一致导致的。针对于 MultipartFormDataContent 的行为,如果 Boundary 后面的值带有双引号是符合标准的。

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”}
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。

您可能感兴趣的文章:ASP.NET Core扩展库之Http通用扩展库的使用详解ASP.NET Core扩展库之Http日志的使用详解如何在ASP.NET Core中使用HttpClientFactory在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求在ASP.NET Core中应用HttpClient获取数据和内容在ASP.NET Core5.0中访问HttpContext的方法步骤.NET CORE HttpClient的使用方法ASP.NET Core中的Http缓存使用.net Core 使用IHttpClientFactory请求实现.Net Core下HTTP请求IHttpClientFactory示例详解如何在 .NET 中使用 Flurl 高效处理Http请求

.NET
Core
HttpClient
表单

相关文章
简单好用的ASP.NET分页类(支持AJAX、自定义文字)这篇文章主要介绍了简单好用的ASP.NET分页类(支持AJAX、自定义文字),本文直接给出实现代码和使用方法,需要的朋友可以参考下 2015-06-06
asp.net 生成缩略图代码asp.net 生成缩略图代码,需要的朋友可以参考下。 2010-03-03
asp.net 独立Discuz头像编辑模块分离打包在Discuz产品系列(包括UCenter、UCHome)中有一个flash头像上传编辑的功能比较好用,和之前自己用js实现的照片在线编辑插件比较像,于是想将它独立出来,一方面可以学习研究,另一方面有机会可以在项目中使用(这里主要是指Asp.Net程序,php的与之类似)。 2011-06-06
使用 ServiceStack.Text 序列化 json的实现代码今天发篇文章总结下自己使用 ServiceStack.Text 来序列化 json。它的速度比 Newtonsoft.Json 快很多,在测试时发现比 fastJson 还快些 2013-06-06
asp.net数据绑定时动态改变值的代码.net数据绑定时动态改变值 2010-06-06
c#中两种不同的存储过程调用与比较存储过程的调用在B/S系统中用的很多。传统的调用方法不仅速度慢,而且代码会随着存储过程的增多不断膨胀,难以维护。新的方法在一定程度上解决了这些问题 2012-12-12
在Asp.net网页上写读Cookie的两种不同语法介绍asp.net开发时,为了存储一些信息通常是Session与Cookie同时使用,本文将会补充一下Cookie相关的资料,感兴趣的朋友可以了解一下在网页上写读Cookie的实现,希望本文对你有所帮助 2013-01-01
C#中常用的分页存储过程小结C#中常用的分页存储过程小结,需要利用存储过程分页的朋友可以参考下。 2010-05-05
Asp.net实现MVC处理文件的上传下载功能实例教程这篇文章主要介绍了Asp.net实现MVC处理文件的上传下载功能,比较全面而系统的对Asp.net MVC的文件上传下载功能进行了深入分析,有很好的借鉴价值,需要的朋友可以参考下 2014-08-08
使用asp.net改变图片颜色如灰色的变成彩色在网站上改变图片的颜色,比如灰色的变成彩色,彩色的变成灰色,下面是经过测试可行的解决方案 2014-09-09

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。