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

net,core,开发,如何,解决,cannot,access,disposed,object,这个,问题 · 浏览次数 : 536

小编点评

#归纳总结 **知识和技能在出现问题和解决问题的过程中积累的** 不忘初心,继续努力,老天不会亏待努力的人。 **生成内容时需要带简单的排版** -格式:“name=\\\"Details\\\"\\r\\\r\<p>asdfsadfas</p><p>asdfsadf</p><p>fasdfsadfsadf</p>'” -数据中的换行符需要替换为单引号 -数据中的双引号需要替换为单引号

正文

一、简介
    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

    遇到问题是好事,说明自己还有不足,那就解决它,时间长了,技术和知识也就积累了。其实解决方法不难,话不多,直接上解决方案。

二、解决方案的具体实现
   解决方法很简单,不需要做过多解释,直接找个配置和编码就可以了,我贴完整源码,是便于以后查阅,不喜勿喷。

    总共三步:红色字体写好了操作步骤(说明一下,红色字体是要解决方法,其他不要关注,把整个代码贴出来,是为了以后查阅

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using OpticalTrap.Framework.DataAccessors;
using OpticalTrap.Web.Facade.Extensions.Filters;
using OpticalTrap.Web.Facade.Utilities;
using OpticalTrap.Web.ServiceManager;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews(option =>
{
    option.Filters.Add(typeof(GlobalAuthorizationFilterAttribute));
    option.Filters.Add(typeof(GlobalOperationLogFilterAttribute));
}).AddXmlSerializerFormatters();

#region 第一步:配置可以同步请求读取流数据

builder.Services.Configure<KestrelServerOptions>(k => k.AllowSynchronousIO = true)
    .Configure<IISServerOptions>(k => k.AllowSynchronousIO = true);

#endregion

#region 配置日志

builder.Logging.AddLog4Net("ConfigFiles/log4net.config");

#endregion

#region 配置 Session

builder.Services.AddSession();

#endregion

#region 配置数据库

builder.Services.AddTransientSqlSugar(builder.Configuration["ConnectionStrings:DefaultConnectionString"]);

#endregion

#region 配置区域

builder.Services.Configure<RazorViewEngineOptions>(option =>
{
    option.AreaViewLocationFormats.Clear();
    option.AreaViewLocationFormats.Add("/Areas/{2}/Views/{1}/{0}.cshtml");
    option.AreaViewLocationFormats.Add("/Areas/{2}/Views/Shared/{0}.cshtml");
    option.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});

#endregion

#region 配置服务实例

builder.Services.AddBusinessServices();
builder.Services.AddUtilityServices();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<SessionCacheObjectProvider>();
builder.Services.AddTransient<AuthorizedDataGridGeneratorWrapper>();
builder.Services.AddSingleton<PageNumberGenerator>();

#endregion

#region 认证设置

builder.Services.AddAuthentication(option =>
{
    option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.LoginPath = "/Validation/Index";
    options.LogoutPath = "/Validation/Logout";
    options.AccessDeniedPath = "/Validation/Index";
    options.Cookie.HttpOnly = true;
    options.ClaimsIssuer = "Cookie";
});

#endregion

var app = builder.Build();

//第二步:启用倒带, 在发生异常时, 可以通过过滤器获取post参数
app.Use((context, next) =>
{
    context.Request.EnableBuffering();
    return next(context);
});

if (app.Environment.IsProduction())
{
    app.UseStatusCodePagesWithReExecute("/ErrorHandler/HttpStatusCode", "?statusCode={0}");
    app.UseExceptionHandler("/ErrorHandler/ExceptionHandler");
}
else
{
    app.UseDeveloperExceptionPage();
}

app.UseStaticFiles();

app.UseSession();
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute("defaultAreaRoute", "{area:exists}/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute("defaultRoute", "{controller=Home}/{action=Index}/{id?}");

app.Run();
 
        我写了一个过滤器(实现日志功能),实现的是IActionFilter 过滤器,在过滤器中,获取Post请求Body的Context使用下面方式获取强调(强调,关注红色字体,其他无关,这是我写的日志功能,贴全部代码,便于以后查阅,不喜勿喷)
  1 using Microsoft.AspNetCore.Mvc.Filters;
  2 using OpticalTrap.Framework.Loggings;
  3 using OpticalTrap.Web.ConstProvider;
  4 using OpticalTrap.Web.Contracts;
  5 using OpticalTrap.Web.Facade.Controllers;
  6 using OpticalTrap.Web.Models;
  7 using System.Reflection;
  8 using System.Security.Claims;
  9 using System.Text;
 10 
 11 namespace OpticalTrap.Web.Facade.Extensions.Filters
 12 {
 13     /// <summary>
 14     /// 该类型定义了全局处理操作日志的过滤器,该类型是密封类型。
 15     /// </summary>
 16     public sealed class GlobalOperationLogFilterAttribute : Attribute, IActionFilter, IAsyncActionFilter
 17     {
 18         #region 实例字段
 19 
 20         private readonly IOperationLogService _operationLogService;
 21         private readonly IServiceProvider _serviceProvider;
 22 
 23         #endregion
 24 
 25         #region 构造函数
 26 
 27         /// <summary>
 28         /// 初始化该类型的新实例。
 29         /// </summary>
 30         /// <param name="operationLogService">需要注入的操作日志服务实例。</param>
 31         /// <param name="serviceProvider">需要注入的服务提供器。</param>
 32         public GlobalOperationLogFilterAttribute(IOperationLogService operationLogService, IServiceProvider serviceProvider)
 33         {
 34             _operationLogService = operationLogService;
 35             _serviceProvider = serviceProvider;
 36         }
 37 
 38         #endregion
 39 
 40         #region 操作日志的同步方法
 41 
 42         /// <summary>
 43         /// 在标注方法执行之前执行该方法。
 44         /// </summary>
 45         /// <param name="context">方法执行前的上下文。</param>
 46         public async void OnActionExecuting(ActionExecutingContext context)
 47         {
 48             if (context.Controller.GetType() != typeof(ErrorHandlerController))
 49             {
 50                 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
 51                 {
 52                     #region 核心处理
 53 
 54                     var controllerType = context.Controller.GetType();
 55                     var controllerName = controllerType.Name;
 56                     var currentMethodName = context.ActionDescriptor.RouteValues["action"]!;
 57 
 58                     string? loginName = string.Empty;
 59                     var claimKeysProvider = _serviceProvider.GetService<ClaimKeysConstProvider>();
 60                     if (claimKeysProvider != null)
 61                     {
 62                         loginName = context.HttpContext.User.FindFirstValue(claimKeysProvider.ClaimStoreUserNameKey);
 63                     }
 64 
 65                     var currentDateTime = DateTime.Now;
 66                     var methodType = context.HttpContext.Request.Method;
 67                     string parameterResult = string.Empty;
 68                     //获取 Get 方法传递的参数,包括查询参数(queryString的值)和Id({controller=home}/{action=index}/{id?})值,路由配置中的Id。
 69                     if (string.Compare(methodType, "get", true) == 0)
 70                     {
 71                         if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
 72                         {
 73                             parameterResult = context.HttpContext.Request.QueryString.Value;
 74                         }
 75 
 76                         if (context.ActionArguments.ContainsKey("id"))
 77                         {
 78                             string? id = context.ActionDescriptor.RouteValues["id"];
 79                             if (!string.IsNullOrEmpty(id) && !string.IsNullOrWhiteSpace(id))
 80                             {
 81                                 if (string.IsNullOrEmpty(parameterResult) || string.IsNullOrWhiteSpace(parameterResult))
 82                                 {
 83                                     parameterResult = $"id={id}";
 84                                 }
 85                                 else
 86                                 {
 87                                     parameterResult += $"&id={id}";
 88                                 }
 89                             }
 90                         }
 91                     }
 92                     else
 93                     {
 94                         //获取 Post 方法传递的参数,读取 request.body 里的的参数, 必须在在 Program.cs 里也启用倒带功能
 95                         context.HttpContext.Request.EnableBuffering();
 96                         context.HttpContext.Request.Body.Position = 0;
 97                         using (var memoryStream = new MemoryStream())
 98                         {
 99                             context.HttpContext.Request.Body.CopyTo(memoryStream);
100                             var streamBytes = memoryStream.ToArray();
101                             parameterResult = Encoding.UTF8.GetString(streamBytes);
102                         }
103                         //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))
104                         //{
105                         //   var bodyRead = reader.ReadToEndAsync();
106                         //   bodyStr = bodyRead.Result;  //把body赋值给bodyStr
107                         //   needKey = JsonConvert.DeserializeAnonymousType
108                         //  (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();
109                         //}
110                         if (controllerType != typeof(ValidationController))
111                         {
112                             parameterResult = ProcessFormParameters(parameterResult);
113                         }
114                         else
115                         {
116                             parameterResult = ProcessLoginUserNameParameters(parameterResult, out loginName);
117                         }
118                     }
119 
120                     parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
121                     loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
122                     Guid userid = Guid.Empty;
123                     if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
124                     {
125                         userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
126                     }
127                     else
128                     {
129                         userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
130                     }
131 
132                     OperationLog log = new OperationLog()
133                     {
134                         Id = Guid.NewGuid(),
135                         Name = $"{loginName} 执行 {controllerName}.{currentMethodName} 操作。",
136                         LoginName = loginName,
137                         Parameters = parameterResult,
138                         ActionName = $"{controllerType.FullName}.{currentMethodName}",
139                         ActionType = methodType,
140                         Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
141                         Remarks = "全局日志记录器记录的日志。",
142                         CreateUserId = userid,
143                         CreateDate = currentDateTime
144                     };
145 
146                     try
147                     {
148                         MethodInfo? methodInfo;
149                         //如果 Controller 类型配置了 RequiredLogAttribute 特性,说明这个 Controller 里面的所有方法都需要记录日志。
150                         //如果 Controler 配置了 RequiredLogAttribute 特性,但是方法配置 NoLogAttribute 特性,则不记录日志,否则记录日志。
151                         if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
152                         {
153                             methodInfo = controllerType.GetMethod(currentMethodName);
154                             if (methodInfo != null && !methodInfo.IsDefined(typeof(NoLogAttribute), false))
155                             {
156                                 await _operationLogService.InsertAsync(log);
157                             }
158                         }
159                         else
160                         {
161                             //针对方法配置了 RequiredLogAttribute 特性执行记录日志的功能
162                             methodInfo = controllerType.GetMethod(currentMethodName);
163                             if (methodInfo != null && methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
164                             {
165                                 await _operationLogService.InsertAsync(log);
166                             }
167                         }
168                     }
169                     catch (Exception ex)
170                     {
171                         log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
172                         log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
173 
174                         await _operationLogService.InsertAsync(log);
175                     }
176 
177                     #endregion
178                 }
179             }
180         }
181 
182         /// <summary>
183         /// 在标注方法执行之后执行该方法。
184         /// </summary>
185         /// <param name="context">方法执行后的上下文。</param>
186         public void OnActionExecuted(ActionExecutedContext context) { }
187 
188         #endregion
189 
190         #region 操作日志的异步方法
191 
192         /// <summary>
193         /// 全局日志记录器异步实现的操作日志的记录。
194         /// </summary>
195         /// <param name="context">方法执行前的上下文。</param>
196         /// <param name="next">方法执行的下一个环节代理。</param>
197         /// <returns></returns>
198         public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
199         {
200             if (context.Controller.GetType() != typeof(ErrorHandlerController))
201             {
202                 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
203                 {
204                     #region 核心处理
205 
206                     var controllerType = context.Controller.GetType();
207                     var controllerName = controllerType.Name;
208                     var currentMethodName = context.ActionDescriptor.RouteValues["action"]!;
209 
210                     string? loginName = string.Empty;
211                     var claimKeysProvider = _serviceProvider.GetService<ClaimKeysConstProvider>();
212                     if (claimKeysProvider != null)
213                     {
214                         loginName = context.HttpContext.User.FindFirstValue(claimKeysProvider.ClaimStoreUserNameKey);
215                     }
216 
217                     var currentDateTime = DateTime.Now;
218                     var methodType = context.HttpContext.Request.Method;
219                     string parameterResult = string.Empty;
220                     //获取 Get 方法传递的参数,包括查询参数(queryString的值)和Id({controller=home}/{action=index}/{id?})值,路由配置中的Id。
221                     if (string.Compare(methodType, "get", true) == 0)
222                     {
223                         if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
224                         {
225                             parameterResult = context.HttpContext.Request.QueryString.Value;
226                         }
227 
228                         if (context.ActionArguments.ContainsKey("id"))
229                         {
230                             string? id = context.ActionArguments["id"]!.ToString();
231                             if (!string.IsNullOrEmpty(id) && !string.IsNullOrWhiteSpace(id))
232                             {
233                                 if (string.IsNullOrEmpty(parameterResult) || string.IsNullOrWhiteSpace(parameterResult))
234                                 {
235                                     parameterResult = $"id={id}";
236                                 }
237                                 else
238                                 {
239                                     parameterResult += $"&id={id}";
240                                 }
241                             }
242                         }
243                     }
244                     else
245                     {
246                         //获取 Post 方法传递的参数,读取 request.body 里的的参数, 必须在在 Program.cs 里也启用倒带功能
247                         context.HttpContext.Request.EnableBuffering();
248                         context.HttpContext.Request.Body.Position = 0;
249                         using (var memoryStream = new MemoryStream())
250                         {
251                             context.HttpContext.Request.Body.CopyTo(memoryStream);
252                             var streamBytes = memoryStream.ToArray();
253                             parameterResult = Encoding.UTF8.GetString(streamBytes);
254                         }
255                         //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))
256                         //{
257                         //   var bodyRead = reader.ReadToEndAsync();
258                         //   bodyStr = bodyRead.Result;  //把body赋值给bodyStr
259                         //   needKey = JsonConvert.DeserializeAnonymousType
260                         //  (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();
261                         //}
262                         if (controllerType != typeof(ValidationController))
263                         {
264                             parameterResult = ProcessFormParameters(parameterResult);
265                         }
266                         else
267                         {
268                             parameterResult = ProcessLoginUserNameParameters(parameterResult, out loginName);
269                         }
270                     }
271 
272                     parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
273                     loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
274                     Guid userid = Guid.Empty;
275                     if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
276                     {
277                         userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
278                     }
279                     else
280                     {
281                         userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
282                     }
283 
284                     OperationLog log = new OperationLog()
285                     {
286                         Id = Guid.NewGuid(),
287                         Name = $"{loginName} 执行 {controllerName}.{currentMethodName} 操作。",
288                         LoginName = loginName,
289                         Parameters = parameterResult,
290                         ActionName = $"{controllerType.FullName}.{currentMethodName}",
291                         ActionType = methodType,
292                         Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
293                         Remarks = "全局日志记录器记录的日志。",
294                         CreateUserId = userid,
295                         CreateDate = currentDateTime
296                     };
297 
298                     try
299                     {
300                         MethodInfo? methodInfo;
301                         //如果 Controller 类型配置了 RequiredLogAttribute 特性,说明这个 Controller 里面的所有方法都需要记录日志。
302                         //如果 Controler 配置了 RequiredLogAttribute 特性,但是方法配置 NoLogAttribute 特性,则不记录日志,否则记录日志。
303                         if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
304                         {
305                             methodInfo = controllerType.GetMethod(currentMethodName);
306                             if (methodInfo != null && !methodInfo.IsDefined(typeof(NoLogAttribute), false))
307                             {
308                                 await _operationLogService.InsertAsync(log);
309                             }
310                         }
311                         else
312                         {
313                             //针对方法配置了 RequiredLogAttribute 特性执行记录日志的功能
314                             methodInfo = controllerType.GetMethod(currentMethodName);
315                             if (methodInfo != null && methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
316                             {
317                                 await _operationLogService.InsertAsync(log);
318                             }
319                         }
320                     }
321                     catch (Exception ex)
322                     {
323                         log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
324                         log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
325 
326                         await _operationLogService.InsertAsync(log);
327                     }
328 
329                     #endregion
330                 }
331             }
332 
333             await next.Invoke();
334         }
335 
336         /// <summary>
337         /// 处理用户登录页面所传递的参数,如果包含用户的登录密码,替换成星号。
338         /// </summary>
339         /// <param name="parameters">要处理的参数字符串。</param>
340         /// <param name="loginName">返回用户的登录系统的用户名称。</param>
341         /// <returns></returns>
342         private string ProcessLoginUserNameParameters(string parameters, out string loginName)
343         {
344             loginName = string.Empty;
345             if (parameters.IndexOf("&__RequestVerificationToken") != -1)
346             {
347                 parameters = parameters.Substring(0, parameters.LastIndexOf("&__RequestVerificationToken"));
348                 if (parameters.IndexOf("userName=") != -1)
349                 {
350                     loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
351                     parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
352                 }
353             }
354             else
355             {
356                 if (parameters.IndexOf("userName=") != -1)
357                 {
358                     loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
359                     parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
360                 }
361             }
362             return parameters;
363         }
364 
365         /// <summary>
366         /// 返回经过处理的 Form 表单参数。
367         /// </summary>
368         /// <param name="originalFormParameters">未经处理的、原始的 Form 表单参数。</param>
369         /// <returns></returns>
370         private string ProcessFormParameters(string originalFormParameters)
371         {
372             string result = "没有 Form 表单参数。";
373             if (string.IsNullOrEmpty(originalFormParameters) || string.IsNullOrWhiteSpace(originalFormParameters))
374             {
375                 return result;
376             }
377 
378             if (originalFormParameters.IndexOf("=") != -1 && (originalFormParameters.IndexOf("=") != originalFormParameters.LastIndexOf("=")))
379             {
380                 var formParameters = originalFormParameters.Split(new string[] { "-----------------------------", "Content-Disposition: form-data;" }, StringSplitOptions.RemoveEmptyEntries);
381                 var filterParameter = new List<string>();
382 
383                 //获取参数数据,包含=等号的就是form表单的值
384                 foreach (var parameter in formParameters)
385                 {
386                     if (parameter.IndexOf("=") != -1 && parameter.IndexOf("__RequestVerificationToken", StringComparison.CurrentCultureIgnoreCase) == -1)
387                     {
388                         filterParameter.Add(parameter);
389                     }
390                 }
391                 //整理表单数据格式为:name='xxxx' value='yyyyyy'\r\nname='xxxx2' value='yyyyyy2'....
392                 if (filterParameter.Count > 0)
393                 {
394                     for (int i = 0; i < filterParameter.Count; i++)
395                     {
396                         filterParameter[i] = ProcessCore(filterParameter[i]);
397                     }
398                 }
399 
400                 //凭借结果值,并返回。
401                 if (filterParameter.Count > 0)
402                 {
403                     result = string.Join("\r\n", filterParameter);
404                 }
405             }
406 
407             return result;
408         }
409 
410         /// <summary>
411         /// 递归的处理参数的格式,将格式转换为 name='xxxx' value='yyyyyy'。
412         /// </summary>
413         /// <param name="parameter">要处理的参数。</param>
414         /// <returns>返回处理好的参数。</returns>
415         private string ProcessCore(string parameter)
416         {
417             //过滤Form表单中的图片,只获取字段名和值,具体上传文件的数据不保留。
418             if (parameter.IndexOf("Content-Type: image/", StringComparison.CurrentCultureIgnoreCase) != -1)
419             {
420                 parameter = parameter.Substring(0, parameter.IndexOf("Content-Type: image/"));
421             }
422             else if (parameter.IndexOf("\"") != -1)//替换数据中的斜杠和双引号为单引号
423             {
424                 parameter = parameter.Replace("\"", "'");
425             }
426             else if (parameter.IndexOf("\r\n\r\n") != -1)
427             //替换数据中的两个换行符为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>'”
428             {
429                 parameter = parameter.Replace("\r\n\r\n", " value='");
430             }
431             else if (parameter.EndsWith("\r\n"))
432             //替换数据尾部的换行符为单引号,格式:“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>'”
433             {
434                 parameter = parameter.Replace("\r\n", "'");
435             }
436             else if (parameter.IndexOf(";") != -1)
437             {
438                 parameter = parameter.Replace(";", " ");
439             }
440             else if (parameter.IndexOf("''") != -1)
441             {
442                 parameter = parameter.Replace("''", "'");
443             }
444             else
445             {
446                 return parameter;
447             }
448             return ProcessCore(parameter);
449         }
450 
451         #endregion
452     }
453 }

 


三、总结

    好了,写完了,今天又解决了一个问题,知识和技能就是在出现问题和解决问题的过程中积累的,不忘初心,继续努力,老天不会亏待努力的人。

与在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题相似的内容:

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

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

ASP.NET Core Web中使用AutoMapper进行对象映射

前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量的开发工作量,提高开发工

【源码解读】asp.net core源码启动流程精细解读

引言 core出来至今,已经7年了,我接触也已经4年了,从开始的2.1,2.2,3.1,5,6再到如今的7,一直都有再用,虽然我是一个Winform仔,但是源码一直从3.1到7都有再看,然后在QQ上面也一直比较活跃,之前好几年前一直说给大家解读asp.net core源码,在之前的博客中,讲的都是比

Visual Studio Code调试和发布ASP.NET Core Web应用

前言 上一篇文章主要讲了Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VS Code中调试和发布ASP.NET Core Web应用。 Visual Studio Code安装C#开发工具包并编写AS

Asp-Net-Core开发笔记:使用ActionFilterAttribute实现非侵入式的参数校验

前言 在现代应用开发中,确保API的安全性和可靠性至关重要。 面向切面编程(AOP)通过将横切关注点(如验证、日志记录、异常处理)与核心业务逻辑分离,极大地提升了代码的模块化和可维护性。 在ASP.NET Core中,利用ActionFilterAttribute可以方便地实现AOP的理念,能够以简

一套基于 .NET Core 开发的支付SDK集 - paylink

前言 在我们的日常工作开发中对接一些第三方支付是比较常见的,如最常见的就是支付宝、微信支付的对接。今天给大家推荐一个基于.NET Core开发的支付SDK集:paylink,它极大简化了API调用及通知的处理流程从而大大提供我们的工作生产效率。 运行环境 .NET Core 3.1、.NET 6.0

Asp-Net-Core开发笔记:快速在已有项目中引入EFCore

前言 很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便。 本文以 StarBlog 为例,StarBlog 目前使用的 ORM 是 FreeSQL ,引入 EFCore 对我来说最大的好处是支持多个数据库,如果是

DotNetGuide专栏C#/.NET/.NET Core充电站(让你学习不迷路)

DotNetGuide简介 记录、收集和总结C#/.NET/.NET Core基础知识、学习路线、开发实战、编程技巧练习、学习视频、文章、书籍、项目框架、社区组织、开发必备工具、常见面试题、面试须知、简历模板、以及自己在学习和工作中的一些微薄见解。希望能和大家一起学习,共同进步。如果本知识库能为您提

DotNetGuide新增C#/.NET/.NET Core充电站(让你学习不迷路)

DotNetGuide简介 记录、收集和总结C#/.NET/.NET Core基础知识、学习路线、开发实战、学习视频、文章、书籍、项目框架、社区组织、开发必备工具、常见面试题、面试须知、简历模板、以及自己在学习和工作中的一些微薄见解。希望能和大家一起学习,共同进步👊【让现在的自己不再迷茫✨,如果本

基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

## 前言 笔者认为,一个博客网站,最核心的是阅读体验。 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能。 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做前端渲染,过渡一下。前端渲染我是不满意的,因为性能较差,页面加载出来还会闪一下,有割裂感,影响