zoukankan      html  css  js  c++  java
  • 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序列化教程
  • 相关阅读:
    戴尔笔记本win8.1+UEFI下安装Ubuntu14.04过程记录
    socketpair的使用
    上传App时遇IDFA错误问题
    1-4标签的语法
    TCP协议中的三次握手和四次挥手(图解)
    TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
    STL vector使用方法介绍
    史上最强视频站点真实地址解析
    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
    ASP.NET——验证码的制作
  • 原文地址:https://www.cnblogs.com/wfpanskxin/p/12920455.html
Copyright © 2011-2022 走看看