在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题
一、简介
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 Newtonsoft.Json;
3 using OpticalTrap.Framework.Loggings;
4 using OpticalTrap.Web.ConstProvider;
5 using OpticalTrap.Web.Contracts;
6 using OpticalTrap.Web.Facade.Controllers;
7 using OpticalTrap.Web.Models;
8 using System.Reflection;
9 using System.Security.Claims;
10 using System.Text;
11
12 namespace OpticalTrap.Web.Facade.Extensions.Filters
13 {
14 /// <summary>
15 /// 该类型定义了全局处理操作日志的过滤器,该类型是密封类型。
16 /// </summary>
17 public sealed class GlobalOperationLogFilterAttribute : Attribute, IActionFilter, IAsyncActionFilter
18 {
19 #region 实例字段
20
21 private readonly ILogger<GlobalOperationLogFilterAttribute> _logger;
22 private readonly IServiceProvider _serviceProvider;
23
24 #endregion
25
26 #region 构造函数
27
28 /// <summary>
29 /// 初始化该类型的新实例。
30 /// </summary>
31 /// <param name="logger">需要注入的日志服务实例。</param>
32 /// <param name="serviceProvider">需要注入的服务提供器。</param>
33 public GlobalOperationLogFilterAttribute(ILogger<GlobalOperationLogFilterAttribute> logger, IServiceProvider serviceProvider)
34 {
35 _logger = logger;
36 _serviceProvider = serviceProvider;
37 }
38
39 #endregion
40
41 #region 操作日志的同步方法
42
43 /// <summary>
44 /// 在标注方法执行之前执行该方法。
45 /// </summary>
46 /// <param name="context">方法执行前的上下文。</param>
47 public async void OnActionExecuting(ActionExecutingContext context)
48 {
49 if (context.Controller.GetType() != typeof(ErrorHandlerController))
50 {
51 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
52 {
53 #region 核心处理
54
55 var controllerType = context.Controller.GetType();
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 if (string.Compare(methodType, "get", true) == 0)
69 {
70 if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
71 {
72 parameterResult = context.HttpContext.Request.QueryString.Value;
73 }
74 }
75 else
76 {
77 //第三步:在同步方法里的使用:启用倒带, 读取request.body里的的参数, 还必须在在Program.cs里也启用倒带功能
78 context.HttpContext.Request.EnableBuffering();
79 context.HttpContext.Request.Body.Position = 0;
80 using (var memoryStream = new MemoryStream())
81 {
82 context.HttpContext.Request.Body.CopyTo(memoryStream);
83 var streamBytes = memoryStream.ToArray();
84 parameterResult = Encoding.UTF8.GetString(streamBytes); //把body赋值给bodyStr
85 }
86 //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))
//{
// var bodyRead = reader.ReadToEndAsync();
// bodyStr = bodyRead.Result; //把body赋值给bodyStr
// needKey = JsonConvert.DeserializeAnonymousType
// (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();
//}
if (controllerType != typeof(ValidationController))
87 {
88 parameterResult = ProcessFormParameters(parameterResult);
89 }
90 else
91 {
92 parameterResult = ProcessLoginUserNameParameters(parameterResult, controllerType, nameof(ValidationController), currentMethodName, out loginName);
93 }
94 }
95
96 parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
97 loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
98 Guid userid = Guid.Empty;
99 if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
100 {
101 userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
102 }
103 else
104 {
105 userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
106 }
107
108 OperationLog log = new OperationLog()
109 {
110 Id = Guid.NewGuid(),
111 Name = $"{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。",
112 LoginName = loginName,
113 Parameters = parameterResult,
114 ActionName = $"{controllerType.FullName}.{currentMethodName}",
115 ActionType = methodType,
116 Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
117 Remarks = "全局日志记录器记录的日志。",
118 CreateUserId = userid,
119 CreateDate = currentDateTime
120 };
121
122 try
123 {
124 MethodInfo? methodInfo;
125 if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
126 {
127 methodInfo = controllerType.GetMethod(currentMethodName);
128 if (methodInfo != null)
129 {
130 _logger.LogInformation(JsonConvert.SerializeObject(log));
131 }
132 }
133 else
134 {
135 methodInfo = controllerType.GetMethod(currentMethodName);
136 if (methodInfo != null)
137 {
138 if (methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
139 {
140 _logger.LogInformation(JsonConvert.SerializeObject(log));
141 }
142 }
143 }
144 }
145 catch (Exception ex)
146 {
147 log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
148
149 log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
150
151 _logger.LogInformation(JsonConvert.SerializeObject(log));
152 }
153
154 #endregion
155 }
156 }
157 }
158
159 /// <summary>
160 /// 在标注方法执行之后执行该方法。
161 /// </summary>
162 /// <param name="context">方法执行后的上下文。</param>
163 public void OnActionExecuted(ActionExecutedContext context) { }
164
165 #endregion
166
167 #region 操作日志的异步方法
168
169 /// <summary>
170 /// 全局日志记录器异步实现的操作日志的记录。
171 /// </summary>
172 /// <param name="context">方法执行前的上下文。</param>
173 /// <param name="next">方法执行的下一个环节代理。</param>
174 /// <returns></returns>
175 public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
176 {
177 if (context.Controller.GetType() != typeof(ErrorHandlerController))
178 {
179 if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType() == typeof(RequiredLogAttribute)))
180 {
181 #region 核心处理
182
183 var controllerType = context.Controller.GetType();
184 var currentMethodName = context.ActionDescriptor.RouteValues["action"]!;
185
186 string? loginName = string.Empty;
187 var claimKeysProvider = _serviceProvider.GetService<ClaimKeysConstProvider>();
188 if (claimKeysProvider != null)
189 {
190 loginName = context.HttpContext.User.FindFirstValue(claimKeysProvider.ClaimStoreUserNameKey);
191 }
192
193 var currentDateTime = DateTime.Now;
194 var methodType = context.HttpContext.Request.Method;
195 string parameterResult = string.Empty;
196 if (string.Compare(methodType, "get", true) == 0)
197 {
198 if (!string.IsNullOrEmpty(context.HttpContext.Request.QueryString.Value) && !string.IsNullOrWhiteSpace(context.HttpContext.Request.QueryString.Value))
199 {
200 parameterResult = context.HttpContext.Request.QueryString.Value;
201 }
202 }
203 else
204 {
205 //第三步:在异步步方法里的使用:启用倒带, 读取request.body里的的参数, 还必须在在Program.cs里也启用倒带功能
206 context.HttpContext.Request.EnableBuffering();
207 context.HttpContext.Request.Body.Position = 0;
208 using (var memoryStream = new MemoryStream())
209 {
210 context.HttpContext.Request.Body.CopyTo(memoryStream);
211 var streamBytes = memoryStream.ToArray();
212 parameterResult = Encoding.UTF8.GetString(streamBytes); //把body赋值给bodyStr
213 }
//using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))
//{
// var bodyRead = reader.ReadToEndAsync();
// bodyStr = bodyRead.Result; //把body赋值给bodyStr
// needKey = JsonConvert.DeserializeAnonymousType
// (bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();
//}
214 if (controllerType != typeof(ValidationController))
215 {
216 parameterResult = ProcessFormParameters(parameterResult);
217 }
218 else
219 {
220 parameterResult = ProcessLoginUserNameParameters(parameterResult, controllerType, nameof(ValidationController), currentMethodName, out loginName);
221 }
222 }
223
224 parameterResult = !string.IsNullOrEmpty(parameterResult) ? parameterResult : "没有传递任何参数";
225 loginName = !string.IsNullOrEmpty(loginName) ? loginName : "anonymous";
226 Guid userid = Guid.Empty;
227 if (string.IsNullOrEmpty(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)) || string.IsNullOrWhiteSpace(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid)))
228 {
229 userid = Guid.Parse("a05897f9-0c86-4f5a-a581-e5da936d0e4c");
230 }
231 else
232 {
233 userid = Guid.Parse(context.HttpContext.User.FindFirstValue(ClaimTypes.Sid));
234 }
235
236 OperationLog log = new OperationLog()
237 {
238 Id = Guid.NewGuid(),
239 Name = $"{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。",
240 LoginName = loginName,
241 Parameters = parameterResult,
242 ActionName = $"{controllerType.FullName}.{currentMethodName}",
243 ActionType = methodType,
244 Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作顺利完成。",
245 Remarks = "全局日志记录器记录的日志。",
246 CreateUserId = userid,
247 CreateDate = currentDateTime
248 };
249
250 try
251 {
252 MethodInfo? methodInfo;
253 if (controllerType.IsDefined(typeof(RequiredLogAttribute), false))
254 {
255 methodInfo = controllerType.GetMethod(currentMethodName);
256 if (methodInfo != null)
257 {
258 _logger.LogInformation(JsonConvert.SerializeObject(log));
259 }
260 }
261 else
262 {
263 methodInfo = controllerType.GetMethod(currentMethodName);
264 if (methodInfo != null)
265 {
266 if (methodInfo.IsDefined(typeof(RequiredLogAttribute), false))
267 {
268 _logger.LogInformation(JsonConvert.SerializeObject(log));
269 }
270 }
271 }
272 }
273 catch (Exception ex)
274 {
275 log.Name = $"异常操作日志:{loginName}在{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}执行了{currentMethodName}操作。";
276 log.Message = $"【{loginName}】用户在【{currentDateTime.ToString("yyyy-MM-dd HH:mm:ss")}】执行了控制器【{controllerType.FullName}】的【{currentMethodName}】方法,执行方法的类型:{methodType},执行方法所需的参数:【{parameterResult}】,操作没有完成,系统发生了异常。<br/>异常详情:{ex.Message},<br/>异常堆栈:{ex.StackTrace}。";
277
278 _logger.LogInformation(JsonConvert.SerializeObject(log));
279 }
280
281 #endregion
282 }
283 }
284
285 await next.Invoke();
286 }
287
288 /// <summary>
289 /// 处理参数。
290 /// </summary>
291 /// <param name="parameters">要处理的参数字符串。</param>
292 /// <param name="controllerType">控制器的类型。</param>
293 /// <param name="controllerFullName">控制器的全名。</param>
294 /// <param name="currentMethodName">当前调用的方法名称。</param>
295 /// <param name="loginName">登录系统的用户名称。</param>
296 /// <returns></returns>
297 private string ProcessLoginUserNameParameters(string parameters, Type controllerType, string controllerFullName, string currentMethodName, out string loginName)
298 {
299 loginName = string.Empty;
300 if (parameters.IndexOf("&__RequestVerificationToken") != -1)
301 {
302 parameters = parameters.Substring(0, parameters.LastIndexOf("&__RequestVerificationToken"));
303 if ((string.Compare(controllerType.FullName, controllerFullName, true) == 0) && (string.Compare(currentMethodName, "login", true) == 0))
304 {
305 if (parameters.IndexOf("userName=") != -1)
306 {
307 loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
308 parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
309 }
310 }
311 }
312 else
313 {
314 if ((string.Compare(controllerType.FullName, controllerFullName, true) == 0) && (string.Compare(currentMethodName, "login", true) == 0))
315 {
316 if (parameters.IndexOf("userName=") != -1)
317 {
318 loginName = parameters.Substring("userName=".Length, parameters.IndexOf("&password") - "&password".Length);
319 parameters = $"{parameters.Substring(0, parameters.LastIndexOf("=") + 1)}*********";
320 }
321 }
322 }
323 return parameters;
324 }
325
326 /// <summary>
327 /// 返回经过处理的 Form 表单参数。
328 /// </summary>
329 /// <param name="originalFormParameters">未经处理的、原始的 Form 表单参数。</param>
330 /// <returns></returns>
331 private string ProcessFormParameters(string originalFormParameters)
332 {
333 string result = "没有 Form 表单参数。";
334 if (string.IsNullOrEmpty(originalFormParameters) || string.IsNullOrWhiteSpace(originalFormParameters))
335 {
336 return result;
337 }
338
339 if (originalFormParameters.IndexOf("=") != -1 && (originalFormParameters.IndexOf("=") != originalFormParameters.LastIndexOf("=")))
340 {
341 var formParameters = originalFormParameters.Split(new string[] { "-----------------------------", "Content-Disposition: form-data;" }, StringSplitOptions.RemoveEmptyEntries);
342 var filterParameter = new List<string>();
343
344 //获取参数数据,包含=等号的就是form表单的值
345 foreach (var parameter in formParameters)
346 {
347 if (parameter.IndexOf("=") != -1 && parameter.IndexOf("__RequestVerificationToken", StringComparison.CurrentCultureIgnoreCase) == -1)
348 {
349 filterParameter.Add(parameter);
350 }
351 }
352 //整理表单数据格式为:name='xxxx' value='yyyyyy'\r\nname='xxxx2' value='yyyyyy2'....
353 if (filterParameter.Count > 0)
354 {
355 for (int i = 0; i < filterParameter.Count; i++)
356 {
357 filterParameter[i] = ProcessCore(filterParameter[i]);
358 }
359 }
360
361 //凭借结果值,并返回。
362 if (filterParameter.Count > 0)
363 {
364 result = string.Join("\r\n", filterParameter);
365 }
366 }
367
368 return result;
369 }
370
371 /// <summary>
372 /// 递归的处理参数的格式,将格式转换为 name='xxxx' value='yyyyyy'。
373 /// </summary>
374 /// <param name="parameter">要处理的参数。</param>
375 /// <returns>返回处理好的参数。</returns>
376 private string ProcessCore(string parameter)
377 {
378 //过滤Form表单中的图片,只获取字段名和值,具体上传文件的数据不保留。
379 if (parameter.IndexOf("Content-Type: image/", StringComparison.CurrentCultureIgnoreCase) != -1)
380 {
381 parameter = parameter.Substring(0, parameter.IndexOf("Content-Type: image/"));
382 }
383 else if (parameter.IndexOf("\"") != -1)//替换数据中的斜杠和双引号为单引号
384 {
385 parameter = parameter.Replace("\"", "'");
386 }
387 else if (parameter.IndexOf("\r\n\r\n") != -1)
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>'”
389 {
390 parameter = parameter.Replace("\r\n\r\n", " value='");
391 }
392 else if (parameter.EndsWith("\r\n"))
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>'”
394 {
395 parameter = parameter.Replace("\r\n", "'");
396 }
397 else if (parameter.IndexOf(";") != -1)
398 {
399 parameter = parameter.Replace(";", " ");
400 }
401 else if (parameter.IndexOf("''") != -1)
402 {
403 parameter = parameter.Replace("''", "'");
404 }
405 else
406 {
407 return parameter;
408 }
409 return ProcessCore(parameter);
410 }
411
412 #endregion
413 }
414 }
三、总结
好了,写完了,今天又解决了一个问题,知识和技能就是在出现问题和解决问题的过程中积累的,不忘初心,继续努力,老天不会亏待努力的人。
在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题的更多相关文章
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
- Cannot access a disposed object in ASP.NET Core
Cannot access a disposed object in ASP.NET Core 楠木大叔 导航 常见原因 总结 对于.neter来说,在使用ASP.NET Core的过程中 ...
- asp.net Core HttpClient 出现Cannot access a disposed object. Object name: 'SocketsHttpHandler' 的问题。
ASP.NET Core 部署在Centos 中 偶尔出现 One or more errors occurred. (Cannot access a disposed object.Object n ...
- web开发中 代码解决部分IE兼容问题
首先是自己遇到问题: 一套系统,以前的开发asp旧+c#新后台管理扩展.完善后,在2013年前基本无问题,很是畅顺. 其中.到升级了浏览器后.例如ie9以后,则问题出现了. 如图: 这是一个js的 ...
- dotnet core 开发中遇到的问题
1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...
- Web(Jsp+ Servlet)开发中如何解决中文乱码问题
1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...
- [转]开发中如何解决SQL注入的问题
Java防止SQL注入 SQL 注入简介: SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面 ...
- 团队开发中Git冲突解决
正常来说我们团队协作开发过程中,冲突是常有的事,下面介绍下本人在开发中的解决办法. 冲突的主要原因就是由于我们开发人员在分支的同一位置写入了不一样的代码,然后合并到主干上导致我们冲突. 方法: 当冲突 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- GIT在iOS开发中的使用
前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...
随机推荐
- Rainbond PipeLine插件部署与springboot应用部署实践
前言:上一篇介绍额rainbond单机部署+单个节点的k8s环境搭建,本篇介绍rainbond5.12新增的pipeline插件的使用 1.Pipeline插件的安装 安装gitlab与gitlab- ...
- C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF
好久没有动笔写博客了,这个小天地被我闲置的放了好久好久,接下来要慢慢捡起来了. 备注:通过C#的StreamWriter类输出一个TXT流文件,供下位机工程师使用,发现打开的16进制文件中,默认添加了 ...
- 原来还能这样看Java线程的状态及转换
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试.职业成长相关资料等更多精彩文章在公众号「小牛呼噜噜」 大家好,我是呼噜噜,最近一直在梳理Jav ...
- vue中使用西瓜视频中引入自定义样式,绝对可以
首先配置sass-loader和raw-loader 方法,再vue-config.js中加上这一段代码 module.exports = { chainWebpack: config => { ...
- 全渠道定价、库存决策,运筹混合整数规划建模求解,MNL选择模型,内附代码!
0. 写在前面 刊论文!模型简单,代码实现更简单,墙裂推荐!可为运筹建模提供参考,也可作为全渠道零售研究的入门资料ε٩(๑> ₃ <)۶з 全文有点长,前面先放一个博文结构和涉及内容: 第 ...
- 驱动开发:内核使用IO/DPC定时器
本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果 ...
- Oracle问题:ORA-01565
问题 oracle启动时报错,找不到spfile文件. ORA-01078: failure in processing system parameters ORA-01565: error in i ...
- 单元测试、文档测试、读写文件、StringIO和BytesIO
1.单元测试就是为了测试程序执行的正确性 2.编写单元测试时,需要编写一个单元测试类,继承unittest TestCase类 3.单元测试最常用的断言是assert,断言期望抛出指定的异常 4.运行 ...
- golang常用库包:log日志记录-uber的Go日志库zap使用详解
Go 日志记录库:uber-go 的日志操作库 zap 使用 一.简介 zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包. go1.20.2 zap v1.24.0 zap的特性 ...
- 使用Go语言操作HDFS
HDFS(Hadoop分布式文件系统)是Hadoop生态系统的一部分,它是一个可扩展的分布式文件系统,被设计用于在大规模数据集上运行的应用程序 安装相关package: $ go get github ...