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

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

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

代码如下:

        // 七牛CallBack地址,CallbackBody内容name=upload/member/1.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2
        public object Post([FromBody]dynamic data)
        {
            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 };
                return json;

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

            }

        }

现在同样的代码在.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 dynamic Post(
            [FromForm]string CustomOrderNumber,
            [FromForm]int CustomerId
            )
        {}

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

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

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

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

        public dynamic Post(
            string CustomOrderNumber,
            int CustomerId,
            [FromBody]OrderItemDTO[] Items
            )

原文地址:https://www.cnblogs.com/lonelyxmas/p/11125534.html

时间: 2024-10-31 11:06:18

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

net core 模型绑定与之前版本的不同

之前有一个用于七牛上传图片的Callback Url的WebAPI (之前是用.net4.0,运行正常) 代码如下: // 七牛CallBack地址,CallbackBody内容name=upload/member/1.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2 public object Post([FromBody]dynamic data) { ILog logger = LogManager.GetLogger(System.Reflection.Meth

ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

【转】ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

本地化ASP.NET核心模型绑定错误消息

默认错误消息: MissingBindRequiredValueAccessor A value for the '{0}' property was not provided. MissingKeyOrValueAccessor A value is required. ValueMustNotBeNullAccessor The value '{0}' is invalid. AttemptedValueIsInvalidAccessor The value '{0}' is not val

ASP.NET Core 高级系列(一)【下】:模型绑定

简单类型 模型绑定器能将源字符串转换为其本身的简单类型包含如下: Boolean Byte, SByte Char DateTime DateTimeOffset Decimal Double Enum Guid Int16, Int32, Int64 Single TimeSpan UInt16, UInt32, UInt64 Uri Version 复杂类型 一个复杂类型必须有一个public 默认的构造函数以及一些public的可读写的属性用来进行绑定.当模型绑定发生时,复杂类型会用pub

模型绑定(Model Binding)

模型绑定是值用浏览器以HTTP请求方式发送数据来创建.NET对象的过程.(负责生成适当的动作方法参数值) 动作调用器(Action Invoker):调用控制器的动作方法的组件,负责在调用动作方法之前获取动作方法的参数值. 默认的动作调用器(ControllerActionInvoker)依赖于模型绑定器,而模型绑定器(Model Binder)是有IModelBinder接口定义的. public interface IModelBinder { object BindModel(Contro

Action的模型绑定

- 你真的会用Action的模型绑定吗? 在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不了.还有一些怎么传送一个复杂的对象或者Action怎么接收一个复杂的对象等等这些问题.或者有些人遇到复杂的对象或者数组直接就传送个json字符串,然后在Action中把json字符串转成model对象,当然这也是一种做法,但也许不是最优的做法. 一.需求 按

MVC 模型绑定

在WebForm,获取提交表单的值一般都是Request.Form["Title"]这样的方式.在MVC中,提供了模型绑定机制.让后台获取表单或Url中的参数变得更加简单. 一.基本模型绑定 你可以直接在参数中用字符串,整型变量,实体或者是List<实体>的方式获取表单提交的参数. 参数中的这些东西都是与表单中的Html控件的name属性一一对应的. public ActionResult PersonAdd(int Id) { return View(); } 例如以上代

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不了.还有一些怎么传送一个复杂的对象或者Action怎么接收一个复杂的对象等等这些问题.或者有些人遇到复杂的对象或者数组直接就传送个json字符串,然后在Action中把json字符串转成model对象,当然这也是一种做法,但也许不是最优的做法. 一.需求 按照如图的数据格式,传入到Action,用一