翼度科技»论坛 编程开发 .net 查看内容

在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
一、简介
    Net Core跨平台项目开发多了,总会遇到各种各样的问题,我就遇到了一个这样的问题,不能访问 Cannot access a disposed object 错误,经过自己多方努力,查阅资料,终于找到了解决办法,引发这个问题的原因大多数是多次读取请求Body流造成的,需要换一种获取请求Body流方法,不能使用StreamRreader方式,使用Body.CopyTo(ms)方法。

            我使用的环境:Visual Studio 2022
    开发语言:C#
    开发框架:Asp.Net Core Mvc
    DotNet版本:Net 6.0
    遇到问题是好事,说明自己还有不足,那就解决它,时间长了,技术和知识也就积累了。其实解决方法不难,话不多,直接上解决方案。

二、解决方案的具体实现
   解决方法很简单,不需要做过多解释,直接找个配置和编码就可以了,我贴完整源码,是便于以后查阅,不喜勿喷。
    总共三步:红色字体写好了操作步骤(说明一下,红色字体是要解决方法,其他不要关注,把整个代码贴出来,是为了以后查阅
  1. using Microsoft.AspNetCore.Authentication.Cookies;
  2. using Microsoft.AspNetCore.Mvc.Razor;
  3. using Microsoft.AspNetCore.Server.Kestrel.Core;
  4. using OpticalTrap.Framework.DataAccessors;
  5. using OpticalTrap.Web.Facade.Extensions.Filters;
  6. using OpticalTrap.Web.Facade.Utilities;
  7. using OpticalTrap.Web.ServiceManager;
  8. var builder = WebApplication.CreateBuilder(args);
  9. builder.Services.AddControllersWithViews(option =>
  10. {
  11.     option.Filters.Add(typeof(GlobalAuthorizationFilterAttribute));
  12.     option.Filters.Add(typeof(GlobalOperationLogFilterAttribute));
  13. }).AddXmlSerializerFormatters();
  14. #region <strong>第一步:配置可以同步请求读取流数据
  15. builder.Services.Configure<KestrelServerOptions>(k => k.AllowSynchronousIO = true)
  16.     .Configure<IISServerOptions>(k => k.AllowSynchronousIO = true);
  17. </strong>#endregion
  18. #region 配置日志
  19. builder.Logging.AddLog4Net("ConfigFiles/log4net.config");
  20. #endregion
  21. #region 配置 Session
  22. builder.Services.AddSession();
  23. #endregion
  24. #region 配置数据库
  25. builder.Services.AddTransientSqlSugar(builder.Configuration["ConnectionStrings:DefaultConnectionString"]);
  26. #endregion
  27. #region 配置区域
  28. builder.Services.Configure<RazorViewEngineOptions>(option =>
  29. {
  30.     option.AreaViewLocationFormats.Clear();
  31.     option.AreaViewLocationFormats.Add("/Areas/{2}/Views/{1}/{0}.cshtml");
  32.     option.AreaViewLocationFormats.Add("/Areas/{2}/Views/Shared/{0}.cshtml");
  33.     option.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
  34. });
  35. #endregion
  36. #region 配置服务实例
  37. builder.Services.AddBusinessServices();
  38. builder.Services.AddUtilityServices();
  39. builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  40. builder.Services.AddSingleton<SessionCacheObjectProvider>();
  41. builder.Services.AddTransient<AuthorizedDataGridGeneratorWrapper>();
  42. builder.Services.AddSingleton<PageNumberGenerator>();
  43. #endregion
  44. #region 认证设置
  45. builder.Services.AddAuthentication(option =>
  46. {
  47.     option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  48.     option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  49.     option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  50.     option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  51.     option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  52. }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
  53. {
  54.     options.LoginPath = "/Validation/Index";
  55.     options.LogoutPath = "/Validation/Logout";
  56.     options.AccessDeniedPath = "/Validation/Index";
  57.     options.Cookie.HttpOnly = true;
  58.     options.ClaimsIssuer = "Cookie";
  59. });
  60. #endregion
  61. var app = builder.Build();
  62. //<strong>第二步:</strong><strong>启用倒带, 在发生异常时, 可以通过过滤器获取post参数</strong>
  63. <strong>app.Use((context, next) =>
  64. {
  65.     context.Request.EnableBuffering();
  66.     return next(context);
  67. });
  68. </strong>if (app.Environment.IsProduction())
  69. {
  70.     app.UseStatusCodePagesWithReExecute("/ErrorHandler/HttpStatusCode", "?statusCode={0}");
  71.     app.UseExceptionHandler("/ErrorHandler/ExceptionHandler");
  72. }
  73. else
  74. {
  75.     app.UseDeveloperExceptionPage();
  76. }
  77. app.UseStaticFiles();
  78. app.UseSession();
  79. app.UseRouting();
  80. app.UseAuthentication();
  81. app.UseAuthorization();
  82. app.MapControllerRoute("defaultAreaRoute", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  83. app.MapControllerRoute("defaultRoute", "{controller=Home}/{action=Index}/{id?}");
  84. app.Run();
复制代码
 
        我写了一个过滤器(实现日志功能),实现的是IActionFilter 过滤器,在过滤器中,获取Post请求Body的Context使用下面方式获取强调(强调,关注红色字体,其他无关,这是我写的日志功能,贴全部代码,便于以后查阅,不喜勿喷)
  1.   1 using Microsoft.AspNetCore.Mvc.Filters;
  2.   2 using Newtonsoft.Json;
  3.   3 using OpticalTrap.Framework.Loggings;
  4.   4 using OpticalTrap.Web.ConstProvider;
  5.   5 using OpticalTrap.Web.Contracts;
  6.   6 using OpticalTrap.Web.Facade.Controllers;
  7.   7 using OpticalTrap.Web.Models;
  8.   8 using System.Reflection;
  9.   9 using System.Security.Claims;
  10. 10 using System.Text;
  11. 11
  12. 12 namespace OpticalTrap.Web.Facade.Extensions.Filters
  13. 13 {
  14. 14     /// <summary>
  15. 15     /// 该类型定义了全局处理操作日志的过滤器,该类型是密封类型。
  16. 16     /// </summary>
  17. 17     public sealed class GlobalOperationLogFilterAttribute : Attribute, IActionFilter, IAsyncActionFilter
  18. 18     {
  19. 19         #region 实例字段
  20. 20
  21. 21         private readonly ILogger<GlobalOperationLogFilterAttribute> _logger;
  22. 22         private readonly IServiceProvider _serviceProvider;
  23. 23
  24. 24         #endregion
  25. 25
  26. 26         #region 构造函数
  27. 27
  28. 28         /// <summary>
  29. 29         /// 初始化该类型的新实例。
  30. 30         /// </summary>
  31. 31         /// <param name="logger">需要注入的日志服务实例。</param>
  32. 32         /// <param name="serviceProvider">需要注入的服务提供器。</param>
  33. 33         public GlobalOperationLogFilterAttribute(ILogger<GlobalOperationLogFilterAttribute> logger, IServiceProvider serviceProvider)
  34. 34         {
  35. 35             _logger = logger;
  36. 36             _serviceProvider = serviceProvider;
  37. 37         }
  38. 38
  39. 39         #endregion
  40. 40
  41. 41         #region 操作日志的同步方法
  42. 42
  43. 43         /// <summary>
  44. 44         /// 在标注方法执行之前执行该方法。
  45. 45         /// </summary>
  46. 46         /// <param name="context">方法执行前的上下文。</param>
  47. 47         public async void OnActionExecuting(ActionExecutingContext context)
  48. 48         {
  49. 49             if (context.Controller.GetType() != typeof(ErrorHandlerController))
  50. 50             {
  51. 51                 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
  52. 52                 {
  53. 53                     #region 核心处理
  54. 54
  55. 55                     var controllerType = context.Controller.GetType();
  56. 56                     var currentMethodName = context.ActionDescriptor.RouteValues["action"]!;
  57. 57
  58. 58                     string? loginName = string.Empty;
  59. 59                     var claimKeysProvider = _serviceProvider.GetService<ClaimKeysConstProvider>();
  60. 60                     if (claimKeysProvider != null)
  61. 61                     {
  62. 62                         loginName = context.HttpContext.User.FindFirstValue(claimKeysProvider.ClaimStoreUserNameKey);
  63. 63                     }
  64. 64
  65. 65                     var currentDateTime = DateTime.Now;
  66. 66                     var methodType = context.HttpContext.Request.Method;
  67. 67                     string parameterResult = string.Empty;
  68. 68                     if (string.Compare(methodType, "get", true) == 0)
  69. 69                     {
  70. 70                         if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
  71. 71                         {
  72. 72                             parameterResult = context.HttpContext.Request.QueryString.Value;
  73. 73                         }
  74. 74                     }
  75. 75                     else
  76. 76                     {
  77. 77                         //<strong>第三步:在同步方法里的使用:</strong><strong>启用倒带, 读取request.body里的的参数, 还必须在在Program.cs里也启用倒带功能</strong>
  78. 78 <strong>                        context.HttpContext.Request.EnableBuffering();
  79. </strong> 79                         <strong>context.HttpContext.Request.Body.Position = 0;
  80. </strong> 80                         <strong>using (var memoryStream = new MemoryStream())
  81. </strong> 81 <strong>                        {
  82. </strong> 82 <strong>                            context.HttpContext.Request.Body.CopyTo(memoryStream);
  83. </strong> 83                             <strong>var streamBytes = memoryStream.ToArray();
  84. </strong> 84                             <strong>parameterResult = Encoding.UTF8.GetString(streamBytes);</strong> //把body赋值给bodyStr
  85. 85 <strong>                        }
  86. </strong> 86                         //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))<br>                        //{<br>                        //   var bodyRead = reader.ReadToEndAsync();<br>                        //   bodyStr = bodyRead.Result;  //把body赋值给bodyStr<br>                        //   needKey = JsonConvert.DeserializeAnonymousType<br>                //  (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();<br>                        //}
复制代码
  1.                 if (controllerType != typeof(ValidationController))
  2. 87                         {
  3. 88                             parameterResult = ProcessFormParameters(parameterResult);
  4. 89                         }
  5. 90                         else
  6. 91                         {
  7. 92                             parameterResult = ProcessLoginUserNameParameters(parameterResult, controllerType, nameof(ValidationController), currentMethodName, out loginName);
  8. 93                         }
  9. 94                     }
  10. 95
  11. 96                     parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
  12. 97                     loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
  13. 98                     Guid userid = Guid.Empty;
  14. 99                     if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
  15. 100                     {
  16. 101                         userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
  17. 102                     }
  18. 103                     else
  19. 104                     {
  20. 105                         userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
  21. 106                     }
  22. 107
  23. 108                     OperationLog log = new OperationLog()
  24. 109                     {
  25. 110                         Id = Guid.NewGuid(),
  26. 111                         Name = $"{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。",
  27. 112                         LoginName = loginName,
  28. 113                         Parameters = parameterResult,
  29. 114                         ActionName = $"{controllerType.FullName}.{currentMethodName}",
  30. 115                         ActionType = methodType,
  31. 116                         Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
  32. 117                         Remarks = "全局日志记录器记录的日志。",
  33. 118                         CreateUserId = userid,
  34. 119                         CreateDate = currentDateTime
  35. 120                     };
  36. 121
  37. 122                     try
  38. 123                     {
  39. 124                         MethodInfo? methodInfo;
  40. 125                         if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
  41. 126                         {
  42. 127                             methodInfo = controllerType.GetMethod(currentMethodName);
  43. 128                             if (methodInfo != null)
  44. 129                             {
  45. 130                                 _logger.LogInformation(JsonConvert.SerializeObject(log));
  46. 131                             }
  47. 132                         }
  48. 133                         else
  49. 134                         {
  50. 135                             methodInfo = controllerType.GetMethod(currentMethodName);
  51. 136                             if (methodInfo != null)
  52. 137                             {
  53. 138                                 if (methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
  54. 139                                 {
  55. 140                                     _logger.LogInformation(JsonConvert.SerializeObject(log));
  56. 141                                 }
  57. 142                             }
  58. 143                         }
  59. 144                     }
  60. 145                     catch (Exception ex)
  61. 146                     {
  62. 147                         log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
  63. 148
  64. 149                         log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
  65. 150
  66. 151                         _logger.LogInformation(JsonConvert.SerializeObject(log));
  67. 152                     }
  68. 153
  69. 154                     #endregion
  70. 155                 }
  71. 156             }
  72. 157         }
  73. 158
  74. 159         /// <summary>
  75. 160         /// 在标注方法执行之后执行该方法。
  76. 161         /// </summary>
  77. 162         /// <param name="context">方法执行后的上下文。</param>
  78. 163         public void OnActionExecuted(ActionExecutedContext context) { }
  79. 164
  80. 165         #endregion
  81. 166
  82. 167         #region 操作日志的异步方法
  83. 168
  84. 169         /// <summary>
  85. 170         /// 全局日志记录器异步实现的操作日志的记录。
  86. 171         /// </summary>
  87. 172         /// <param name="context">方法执行前的上下文。</param>
  88. 173         /// <param name="next">方法执行的下一个环节代理。</param>
  89. 174         /// <returns></returns>
  90. 175         public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
  91. 176         {
  92. 177             if (context.Controller.GetType() != typeof(ErrorHandlerController))
  93. 178             {
  94. 179                 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
  95. 180                 {
  96. 181                     #region 核心处理
  97. 182
  98. 183                     var controllerType = context.Controller.GetType();
  99. 184                     var currentMethodName = context.ActionDescriptor.RouteValues["action"]!;
  100. 185
  101. 186                     string? loginName = string.Empty;
  102. 187                     var claimKeysProvider = _serviceProvider.GetService<ClaimKeysConstProvider>();
  103. 188                     if (claimKeysProvider != null)
  104. 189                     {
  105. 190                         loginName = context.HttpContext.User.FindFirstValue(claimKeysProvider.ClaimStoreUserNameKey);
  106. 191                     }
  107. 192
  108. 193                     var currentDateTime = DateTime.Now;
  109. 194                     var methodType = context.HttpContext.Request.Method;
  110. 195                     string parameterResult = string.Empty;
  111. 196                     if (string.Compare(methodType, "get", true) == 0)
  112. 197                     {
  113. 198                         if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
  114. 199                         {
  115. 200                             parameterResult = context.HttpContext.Request.QueryString.Value;
  116. 201                         }
  117. 202                     }
  118. 203                     else
  119. 204                     {
  120. 205                         //<strong>第三步:在异步步方法里的使用:</strong><strong>启用倒带, 读取request.body里的的参数, 还必须在在Program.cs里也启用倒带功能</strong>
  121. 206 <strong>                        context.HttpContext.Request.EnableBuffering();
  122. </strong>207                         <strong>context.HttpContext.Request.Body.Position = 0;
  123. </strong>208                         <strong>using (var memoryStream = new MemoryStream())
  124. </strong>209 <strong>                        {
  125. </strong>210 <strong>                            context.HttpContext.Request.Body.CopyTo(memoryStream);
  126. </strong>211                             <strong>var streamBytes = memoryStream.ToArray();
  127. </strong>212                            <strong> parameterResult = Encoding.UTF8.GetString(streamBytes);</strong> //把body赋值给bodyStr
  128. 213 <strong>                        }</strong><br>                //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))<br>                        //{<br>                        //   var bodyRead = reader.ReadToEndAsync();<br>                        //   bodyStr = bodyRead.Result;  //把body赋值给bodyStr<br>                        //   needKey = JsonConvert.DeserializeAnonymousType<br>                //  (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();<br>                        //}
  129. 214                         if (controllerType != typeof(ValidationController))
  130. 215                         {
  131. 216                             parameterResult = ProcessFormParameters(parameterResult);
  132. 217                         }
  133. 218                         else
  134. 219                         {
  135. 220                             parameterResult = ProcessLoginUserNameParameters(parameterResult, controllerType, nameof(ValidationController), currentMethodName, out loginName);
  136. 221                         }                        
  137. 222                     }
  138. 223
  139. 224                     parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
  140. 225                     loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
  141. 226                     Guid userid = Guid.Empty;
  142. 227                     if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
  143. 228                     {
  144. 229                         userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
  145. 230                     }
  146. 231                     else
  147. 232                     {
  148. 233                         userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
  149. 234                     }
  150. 235
  151. 236                     OperationLog log = new OperationLog()
  152. 237                     {
  153. 238                         Id = Guid.NewGuid(),
  154. 239                         Name = $"{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。",
  155. 240                         LoginName = loginName,
  156. 241                         Parameters = parameterResult,
  157. 242                         ActionName = $"{controllerType.FullName}.{currentMethodName}",
  158. 243                         ActionType = methodType,
  159. 244                         Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
  160. 245                         Remarks = "全局日志记录器记录的日志。",
  161. 246                         CreateUserId = userid,
  162. 247                         CreateDate = currentDateTime
  163. 248                     };
  164. 249
  165. 250                     try
  166. 251                     {
  167. 252                         MethodInfo? methodInfo;
  168. 253                         if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
  169. 254                         {
  170. 255                             methodInfo = controllerType.GetMethod(currentMethodName);
  171. 256                             if (methodInfo != null)
  172. 257                             {
  173. 258                                 _logger.LogInformation(JsonConvert.SerializeObject(log));
  174. 259                             }
  175. 260                         }
  176. 261                         else
  177. 262                         {
  178. 263                             methodInfo = controllerType.GetMethod(currentMethodName);
  179. 264                             if (methodInfo != null)
  180. 265                             {
  181. 266                                 if (methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
  182. 267                                 {
  183. 268                                     _logger.LogInformation(JsonConvert.SerializeObject(log));
  184. 269                                 }
  185. 270                             }
  186. 271                         }
  187. 272                     }
  188. 273                     catch (Exception ex)
  189. 274                     {
  190. 275                         log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
  191. 276                         log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
  192. 277
  193. 278                         _logger.LogInformation(JsonConvert.SerializeObject(log));
  194. 279                     }
  195. 280
  196. 281                     #endregion
  197. 282                 }
  198. 283             }
  199. 284
  200. 285             await next.Invoke();
  201. 286         }
  202. 287
  203. 288         /// <summary>
  204. 289         /// 处理参数。
  205. 290         /// </summary>
  206. 291         /// <param name="parameters">要处理的参数字符串。</param>
  207. 292         /// <param name="controllerType">控制器的类型。</param>
  208. 293         /// <param name="controllerFullName">控制器的全名。</param>
  209. 294         /// <param name="currentMethodName">当前调用的方法名称。</param>
  210. 295         /// <param name="loginName">登录系统的用户名称。</param>
  211. 296         /// <returns></returns>
  212. 297         private string ProcessLoginUserNameParameters(string parameters, Type controllerType, string controllerFullName, string currentMethodName, out string loginName)
  213. 298         {
  214. 299             loginName = string.Empty;
  215. 300             if (parameters.IndexOf("&__RequestVerificationToken") != -1)
  216. 301             {
  217. 302                 parameters = parameters.Substring(0, parameters.LastIndexOf("&__RequestVerificationToken"));
  218. 303                 if ((string.Compare(controllerType.FullName, controllerFullName, true) == 0) && (string.Compare(currentMethodName, "login", true) == 0))
  219. 304                 {
  220. 305                     if (parameters.IndexOf("userName=") != -1)
  221. 306                     {
  222. 307                         loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
  223. 308                         parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
  224. 309                     }
  225. 310                 }
  226. 311             }
  227. 312             else
  228. 313             {
  229. 314                 if ((string.Compare(controllerType.FullName, controllerFullName, true) == 0) && (string.Compare(currentMethodName, "login", true) == 0))
  230. 315                 {
  231. 316                     if (parameters.IndexOf("userName=") != -1)
  232. 317                     {
  233. 318                         loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
  234. 319                         parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
  235. 320                     }
  236. 321                 }
  237. 322             }
  238. 323             return parameters;
  239. 324         }
  240. 325
  241. 326         /// <summary>
  242. 327         /// 返回经过处理的 Form 表单参数。
  243. 328         /// </summary>
  244. 329         /// <param name="originalFormParameters">未经处理的、原始的 Form 表单参数。</param>
  245. 330         /// <returns></returns>
  246. 331         private string ProcessFormParameters(string originalFormParameters)
  247. 332         {
  248. 333             string result = "没有 Form 表单参数。";
  249. 334             if (string.IsNullOrEmpty(originalFormParameters) || string.IsNullOrWhiteSpace(originalFormParameters))
  250. 335             {
  251. 336                 return result;
  252. 337             }
  253. 338
  254. 339             if (originalFormParameters.IndexOf("=") != -1 && (originalFormParameters.IndexOf("=") != originalFormParameters.LastIndexOf("=")))
  255. 340             {
  256. 341                 var formParameters = originalFormParameters.Split(new string[] { "-----------------------------", "Content-Disposition: form-data;" }, StringSplitOptions.RemoveEmptyEntries);
  257. 342                 var filterParameter = new List<string>();
  258. 343
  259. 344                 //获取参数数据,包含=等号的就是form表单的值
  260. 345                 foreach (var parameter in formParameters)
  261. 346                 {
  262. 347                     if (parameter.IndexOf("=") != -1 && parameter.IndexOf("__RequestVerificationToken", StringComparison.CurrentCultureIgnoreCase) == -1)
  263. 348                     {
  264. 349                         filterParameter.Add(parameter);
  265. 350                     }
  266. 351                 }
  267. 352                 //整理表单数据格式为:name='xxxx' value='yyyyyy'\r\nname='xxxx2' value='yyyyyy2'....
  268. 353                 if (filterParameter.Count > 0)
  269. 354                 {
  270. 355                     for (int i = 0; i < filterParameter.Count; i++)
  271. 356                     {
  272. 357                         filterParameter[i] = ProcessCore(filterParameter[i]);
  273. 358                     }
  274. 359                 }
  275. 360
  276. 361                 //凭借结果值,并返回。
  277. 362                 if (filterParameter.Count > 0)
  278. 363                 {
  279. 364                     result = string.Join("\r\n", filterParameter);
  280. 365                 }
  281. 366             }
  282. 367
  283. 368             return result;
  284. 369         }
  285. 370
  286. 371         /// <summary>
  287. 372         /// 递归的处理参数的格式,将格式转换为 name='xxxx' value='yyyyyy'。
  288. 373         /// </summary>
  289. 374         /// <param name="parameter">要处理的参数。</param>
  290. 375         /// <returns>返回处理好的参数。</returns>
  291. 376         private string ProcessCore(string parameter)
  292. 377         {
  293. 378             //过滤Form表单中的图片,只获取字段名和值,具体上传文件的数据不保留。
  294. 379             if (parameter.IndexOf("Content-Type: image/", StringComparison.CurrentCultureIgnoreCase) != -1)
  295. 380             {
  296. 381                 parameter = parameter.Substring(0, parameter.IndexOf("Content-Type: image/"));
  297. 382             }
  298. 383             else if (parameter.IndexOf(""") != -1)//替换数据中的斜杠和双引号为单引号
  299. 384             {
  300. 385                 parameter = parameter.Replace(""", "'");
  301. 386             }
  302. 387             else if (parameter.IndexOf("\r\n\r\n") != -1)
  303. 388             //替换数据中的两个换行符为value=',格式:“name="Details"\r\n\r\n<p>asdfsadfas</p><p>asdfsadf</p><p>fasdfsadfsadf</p>\r\n”== “name="Details" value='<p>asdfsadfas</p><p>asdfsadf</p><p>fasdfsadfsadf</p>'”
  304. 389             {
  305. 390                 parameter = parameter.Replace("\r\n\r\n", " value='");
  306. 391             }
  307. 392             else if (parameter.EndsWith("\r\n"))
  308. 393             //替换数据尾部的换行符为单引号,格式:“name="Details"\r\n\r\n<p>asdfsadfas</p><p>asdfsadf</p><p>fasdfsadfsadf</p>\r\n”== “name="Details"\r\n\r\n<p>asdfsadfas</p><p>asdfsadf</p><p>fasdfsadfsadf</p>'”
  309. 394             {
  310. 395                 parameter = parameter.Replace("\r\n", "'");
  311. 396             }
  312. 397             else if (parameter.IndexOf(";") != -1)
  313. 398             {
  314. 399                 parameter = parameter.Replace(";", " ");
  315. 400             }
  316. 401             else if (parameter.IndexOf("''") != -1)
  317. 402             {
  318. 403                 parameter = parameter.Replace("''", "'");
  319. 404             }
  320. 405             else
  321. 406             {
  322. 407                 return parameter;
  323. 408             }
  324. 409             return ProcessCore(parameter);
  325. 410         }
  326. 411
  327. 412         #endregion
  328. 413     }
  329. 414 } 
复制代码
三、总结
    好了,写完了,今天又解决了一个问题,知识和技能就是在出现问题和解决问题的过程中积累的,不忘初心,继续努力,老天不会亏待努力的人。


来源:https://www.cnblogs.com/PatrickLiu/archive/2023/05/31/17445451.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具