之前有一個用於七牛上傳圖片的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 )