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
            )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM