net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式

摘要:
FromForm,对应requestcontent中的urlencodedstring。FromBody,对应requestcontent中的JSONstring。

之前有一个用于七牛上传图片的Callback Url的WebAPI (之前是用.net4.0,运行正常)

代码如下:

        //七牛CallBack地址,CallbackBody内容name=upload/member/1.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2
        public object Post([FromBody]dynamicdata)
        {
            ILog logger =LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            logger.Info("data:" +data.ToString());
            int status = -1;

            try{
                string avator_url =data.name;
                int startPos = "upload/member/".Length;
                string member_id = avator_url.Substring(startPos, avator_url.IndexOf(".jpg") -startPos);
                MemberHelper.UpdateAvator(member_id, avator_url);
                var json = new { results = new string[0], status = 0};
                returnjson;

            }
            catch(Exception ex)
            {
                string msg = ex.Message +ex.StackTrace;
                logger.Error("
 data:" + data.ToString() + "
Exception:" +msg, ex);
                var json = new { results = new string[0], status = status, msg =msg };
                returnjson;

            }


        }

现在同样的代码在.net Core 却提示 HTTP 415 错误–不支持的媒体类型(Unsupported media type)

请参考这篇文章:https://www.cnblogs.com/CreateMyself/p/6246977.html

里面提到ASP.NET MVC/WebAPi中无论是以表单POST的形式抑或JSON的形式控制器具有绑定都Http请求Body的能力同时数据都会返回给我们,我们不需要做出任何特别的说明

七牛CallBack的URL格式应该是用表单POST的形式(contentType: "application/x-www-form-urlencoded").

.net core mvc 模型绑定,默认的参数绑定类型是FromForm

FromQuery,对应 url 中的 urlencoded string ("?key1=value1&key2=value2")。


FromForm,对应 request content 中的 urlencoded string("key1=value1&key2=value2")。


FromBody,对应 request content 中的 JSON string("{"key1":"value1","key2":"value2"}")。

.NET Core 则严格限制了,Post([FromBody]dynamic data) 这个写法, 必须对应参数类型是JSON格式( contentType: "application/json"),否则会出现415错误

我们可以做的就是写2个方法,无论七牛用那个方法去调用,都能正确返回.

        // 七牛CallBack地址,CallbackBody内容name=upload/member/memberId.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2
        [AllowAnonymous]
        [HttpPost("updateAvatorJSON")]
        public object Post([FromBody]dynamic data)
        {
            int status = -1;

            try
            {
                updateAvator(data.name);
                var json = new { results = "", status = 0 };
                return json;

            }
            catch (Exception ex)
            {
                string msg = ex.Message + ex.StackTrace;
                var json = new { results = "", status = status, msg = msg };
                return json;

            }
        }
        [AllowAnonymous]
        [HttpPost("updateAvatorForm")]
        public object Post(string name, string hash)
        {
            int status = -1;

            try
            {
                updateAvator(name);
                var json = new { results = "", status = 0 };
                return json;

            }
            catch (Exception ex)
            {
                string msg = ex.Message + ex.StackTrace;
                var json = new { results = "", status = status, msg = msg };
                return json;

            }
        }

**********后记---- 在微信小程序wx.request时,再次碰到类似的问题*************

客户端:

wx.request({
      url: url,
      method: 'POST',
      header: { "Content-Type": "application/x-www-form-urlencoded"},
      data: dataParam,
      success: function (res) {

      }})

对应的服务器端代码必须用[FromForm]修饰,不然取不到数据. 因为.net core 默认只找QueryString

[HttpPost]
        public dynamicPost(            
            [FromForm]stringCustomOrderNumber,
            [FromForm]intCustomerId
            )
        {}

------------------------------------------------------------------------------------------------------

如果 客户端用"Content-Type": "application/json", 则服务器端必须用[FromBody]

------------------------------------------------------------------------------------------------------

服务器端的[FromForm]和[FromBody]不能混用, api接口要么就一个大对象,要么就要把其他的参数放在QueryString里

        public dynamicPost(            
            stringCustomOrderNumber,
            intCustomerId,
            [FromBody]OrderItemDTO[] Items
            )

免责声明:文章转载自《net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RedisTemplate-Redis的序列化方案ubuntu wine 使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【216】◀▶ IDL 字符串操作说明 (黑底)

参考:String Processing Routines —— 字符串处理函数 参考:IDL_String Methods 01   STRING 返回字符串。 02   STRCMP 比较字符串,一样返回1,不一样返回0,默认大小写敏感。 03   STRMATCH 字符串进行比较,一致返回1,不一致返回0。 04   STRCOMP...

Java实现加密和解密的源代码

本文转载于网络,抄录下来只是为了方便以后查找。原文地址:http://snowolf.iteye.com/blog/379860 加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。如基本的单向加密算法: BASE64 严格...

Java中将String格式的标准时间字符串转换为Date格式的方法

场景 前端在往后端传递时间参数时,传递的是标准时间格式的字符串。 比如下面的lxyf参数 怎样将其转换为Date格式。 注: 博客:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。 实现 调用如下转换格式的方法 Date lxyfDate = str2Date...

华为机试 计算字符个数

题目描述 写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。 输入描述: 第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。 输出描述: 输出输入字符串中含有该字符的个数。 示例1 输入 ABCDEF A 输出 1 sing System; using Syste...

dynamic-insert和dynamic-update属性

dynamic-insert 作用:设置对象中没有值的字段 insert并不会对其进行插入. 实体类映射配置如下 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.o...

.NET CORE与Spring Boot编写控制台程序应有的优雅姿势

本文分别说明.NET CORE与Spring Boot编写控制台程序应有的“正确”方法,以便.NET程序员、JAVA程序员可以相互学习与加深了解,注意本文只介绍用法,不会刻意强调哪种语言或哪种框架写的控制台程序要好。 本文所说的编写控制台程序应有的“正确”方法,我把正确二字加上引号,因为没有绝对的正确,因人而异,因系统设计需求而异,我这里所谓的正确方法是指...