一、简介
    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 这个问题的更多相关文章

  1. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  2. Cannot access a disposed object in ASP.NET Core

    Cannot access a disposed object in ASP.NET Core 楠木大叔     导航 常见原因 总结   对于.neter来说,在使用ASP.NET Core的过程中 ...

  3. 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 ...

  4. web开发中 代码解决部分IE兼容问题

    首先是自己遇到问题: 一套系统,以前的开发asp旧+c#新后台管理扩展.完善后,在2013年前基本无问题,很是畅顺. 其中.到升级了浏览器后.例如ie9以后,则问题出现了. 如图:   这是一个js的 ...

  5. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...

  6. Web(Jsp+ Servlet)开发中如何解决中文乱码问题

    1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...

  7. [转]开发中如何解决SQL注入的问题

    Java防止SQL注入 SQL 注入简介:        SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面 ...

  8. 团队开发中Git冲突解决

    正常来说我们团队协作开发过程中,冲突是常有的事,下面介绍下本人在开发中的解决办法. 冲突的主要原因就是由于我们开发人员在分支的同一位置写入了不一样的代码,然后合并到主干上导致我们冲突. 方法: 当冲突 ...

  9. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  10. GIT在iOS开发中的使用

    前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...

随机推荐

  1. 基于 Agora SDK 实现 iOS 端的多人视频互动

    视频互动直播是当前比较热门的玩法,我们经常见到有PK 连麦.直播答题.一起 KTV.电商直播.互动大班课.视频相亲等. 本文将教你如何通过声网Agora 视频 SDK 在iOS端实现一个视频直播应用. ...

  2. java注解与反射--3

    java注解与反射--3 类的加载与ClassLoader java内存 堆 存放new的对象和数组 可以被所有的线程共享,不会存放别的对象引用 栈 存放基本变量类型 引用对象的变量 方法区 可以被所 ...

  3. python爬取猫眼电影Top100榜单的信息

    爬取并写入MySQL中 import pymysql import requests from bs4 import BeautifulSoup headers = { 'User-Agent': ' ...

  4. IO 与 NIO之网络通信

    一.阻塞IO / 非阻塞NIO 阻塞IO:当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其 ...

  5. nodsjs POST请求

    PHP 遇到问题: 1.跨域问题 报failed to load response data:no data fond for response with give header("Cont ...

  6. 多精度 simulator 中的 RL:一篇 14 年 ICRA 的古早论文

    目录 全文快读 0 abstract 1 intro 2 related work 3 背景 & 假设 3.1 RL & KWIK(know what it knows)的背景 3.2 ...

  7. 【Deep Learning】DDPM

    DDPM 1. 大致流程 1.1 宏观流程 1.2 训练过程 1.3 推理过程 2. 对比GAN 2.1 GAN流程 2.2 相比GAN优点 训练过程更稳定,损失函数指向性更强(loss数值大小指示训 ...

  8. java idea配置流程

    这篇文章主要介绍了IntelliJ IDEA2021.1 配置大全(超详细教程),需要的朋友可以参考下 一.IDEA下载 idea.jdk.tomcat.maven下载地址请参考上一篇博客:https ...

  9. 五月十五日java基础知识点

    1.匿名内部类适用于编写事件程序 interface Ishape{ void shape(); } class MyType{ public void outShape(Ishape s){//接口 ...

  10. Go For Web:一篇文章带你用 Go 搭建一个最简单的 Web 服务、了解 Golang 运行 web 的原理

    前言: 本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍.目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个 ...