netcore3.x Request.Body 讀取Body內容


netcore2.0和3.0還是有很大的差異使用時請多注意:

前提netcore3.0 默認不支持同步方法:ReadToEnd()

使用時需要在Startup中添加:

 //默認不支持同步方法:ReadToEnd()
            services.Configure<KestrelServerOptions>(options =>
            {
                options.AllowSynchronousIO = true;
            });

 

 

 #region BodyModel
        /// <summary>
        /// BodyModel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Request"></param>
        /// <returns></returns>
        public static T BodyModel<T>(this HttpRequest Request) where T : new()
        {
            T t = new T();

            try
            {
                Request.EnableBuffering();  
                using (Stream stream = Request.Body)
                {
                    byte[] buffer = new byte[Request.ContentLength.Value];
                    stream.Read(buffer, 0, buffer.Length);
                    string content = Encoding.UTF8.GetString(buffer);
            Request.Body.Position = 0;
                    t = JsonSerializer.Deserialize<T>(content, JsonOpt.UnicodeRangesAll);
                }
            }
            catch (Exception)
            {
                t = default;
            }
            return t;
        }

        /// <summary>
        /// BodyModel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Request"></param>
        /// <returns></returns>
        public static async Task<T> BodyModelAsync<T>(this HttpRequest Request) where T : new()
        {
            T t = new T();

            try
            {
                Request.EnableBuffering();
                using (var reader = new StreamReader(Request.Body, Encoding.UTF8, true, 1024, true))
                {
                    string body = await reader.ReadToEndAsync();
                    Request.Body.Position = 0;//以后可以重復讀取
                    t = JsonSerializer.Deserialize<T>(body, JsonOpt.UnicodeRangesAll);
                }
            }
            catch (Exception)
            {
                t = default;
            }
            return t;
        }
        #endregion

        #region 多次獲取Body內容
        /// <summary>
        /// 多次獲取Body內容 
        /// 主要用於2.0時代 3.0時代棄用
        /// Request.EnableRewind();//2.0時代
        /// Request.EnableBuffering();//3.0時代
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Request"></param>
        /// <returns></returns>
        public static T MulitBodyModel<T>(this HttpRequest Request) where T : new()
        {
            T t = new T();
            try
            {
                Request.EnableBuffering();
                using (var stream = new MemoryStream())
                {
                    Request.Body.Position = 0;
                    Request.Body.CopyTo(stream);
                    string body = Encoding.UTF8.GetString(stream.ToArray());
                    t = JsonSerializer.Deserialize<T>(body, JsonOpt.UnicodeRangesAll);
                }
            }
            catch (Exception)
            {
                t = default;
            }
            return t;
        }
        #endregion

        #region GetBody
        /// <summary>
        /// GetBody
        /// </summary>
        /// <param name="Request"></param>
        /// <returns></returns>
        public static string GetBody(this HttpRequest Request)
        {
            string result = string.Empty;
            try
            {
                Request.EnableBuffering();
                using (Stream stream = Request.Body)
                {
                    byte[] buffer = new byte[Request.ContentLength.Value];
                    stream.Read(buffer, 0, buffer.Length);
                    result = Encoding.UTF8.GetString(buffer);
            Request.Body.Position = 0;
                }
            }
            catch (Exception) { }
            return result;
        }

        /// <summary>
        /// GetBody
        /// </summary>
        /// <param name="Request"></param>
        /// <returns></returns>
        public static async Task<string> GetBodyAsync(this HttpRequest Request)
        {
            string result = string.Empty;
            try
            {
                Request.EnableBuffering();
                using (var reader = new StreamReader(Request.Body, Encoding.UTF8, true, 1024, true))
                {
                    result = await reader.ReadToEndAsync();
                    Request.Body.Position = 0;//以后可以重復讀取
                }
            }
            catch (Exception) { }
            return result;
        }
        #endregion

        #region GetFormModel
        /// <summary>
        ///  獲取客戶端搜索條件
        /// </summary>
        /// <param name="request"></param>
        /// <returns> </returns>
        public static T GetFormModel<T>(this HttpRequest request)
            where T : class, new()
        {
            T t = new T();
            Type type = t.GetType();

            try
            {
                foreach (PropertyInfo property in type.GetProperties())
                {
                    if (request.Form[property.Name].Count > 0)
                    {
                        property.SetValue(t, Convert.ChangeType((object)request.Form[property.Name][0], ConversionType.InitConversionType(property)), null);
                    }
                }
            }
            catch (Exception)
            {
                t = default;
            }

            return t;
        }
        #endregion

 

 

使用方式:

Person person3 = Request.BodyModel<Person>(); 

參考資料:

Request:  netcore HttpContext 自定義請求上下文內容

微軟自己的  序列化:

System.Text.Json.dll
JsonSerializer序列化教程

 


免責聲明!

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



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