大型网站开发 广州,自己做的娱乐平台网站,网站服务器在哪里买好,官方网站建设账务处理小编典典更新#xff1a;从2.2.2版本开始#xff0c;HttpContextAccessor将上下文保留在一个对象中(据说是为了防止请求之间的混淆)#xff0c;这会影响当前解决方案…因此#xff0c;您需要为IHttpContextAccessor(旧版本)提供以下实现并进行注册作为一个单例#xff1a;…小编典典更新从2.2.2版本开始HttpContextAccessor将上下文保留在一个对象中(据说是为了防止请求之间的混淆)这会影响当前解决方案…因此您需要为IHttpContextAccessor(旧版本)提供以下实现并进行注册作为一个单例public class HttpContextAccessor : IHttpContextAccessor{private static AsyncLocal _httpContextCurrent new AsyncLocal();HttpContext IHttpContextAccessor.HttpContext { get _httpContextCurrent.Value; set _httpContextCurrent.Value value; }}using Microsoft.AspNetCore.Html;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc.Infrastructure;using Microsoft.AspNetCore.Routing;using Microsoft.Extensions.DependencyInjection;using System;using System.IO;using System.Threading.Tasks;namespace Microsoft.AspNetCore.Mvc.Rendering{public static class HtmlHelperViewExtensions{public static IHtmlContent Action(this IHtmlHelper helper, string action, object parameters null){var controller (string)helper.ViewContext.RouteData.Values[controller];return Action(helper, action, controller, parameters);}public static IHtmlContent Action(this IHtmlHelper helper, string action, string controller, object parameters null){var area (string)helper.ViewContext.RouteData.Values[area];return Action(helper, action, controller, area, parameters);}public static IHtmlContent Action(this IHtmlHelper helper, string action, string controller, string area, object parameters null){if (action null)throw new ArgumentNullException(action);if (controller null)throw new ArgumentNullException(controller);var task RenderActionAsync(helper, action, controller, area, parameters);return task.Result;}private static async Task RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters null){// fetching required services for invocationvar serviceProvider helper.ViewContext.HttpContext.RequestServices;var actionContextAccessor helper.ViewContext.HttpContext.RequestServices.GetRequiredService();var httpContextAccessor helper.ViewContext.HttpContext.RequestServices.GetRequiredService();var actionSelector serviceProvider.GetRequiredService();// creating new action invocation contextvar routeData new RouteData();foreach (var router in helper.ViewContext.RouteData.Routers){routeData.PushState(router, null, null);}routeData.PushState(null, new RouteValueDictionary(new { controller controller, action action, area area }), null);routeData.PushState(null, new RouteValueDictionary(parameters ?? new { }), null);//get the actiondescriptorRouteContext routeContext new RouteContext(helper.ViewContext.HttpContext) { RouteData routeData };var candidates actionSelector.SelectCandidates(routeContext);var actionDescriptor actionSelector.SelectBestCandidate(routeContext, candidates);var originalActionContext actionContextAccessor.ActionContext;var originalhttpContext httpContextAccessor.HttpContext;try{var newHttpContext serviceProvider.GetRequiredService().Create(helper.ViewContext.HttpContext.Features);if (newHttpContext.Items.ContainsKey(typeof(IUrlHelper))){newHttpContext.Items.Remove(typeof(IUrlHelper));}newHttpContext.Response.Body new MemoryStream();var actionContext new ActionContext(newHttpContext, routeData, actionDescriptor);actionContextAccessor.ActionContext actionContext;var invoker serviceProvider.GetRequiredService().CreateInvoker(actionContext);await invoker.InvokeAsync();newHttpContext.Response.Body.Position 0;using (var reader new StreamReader(newHttpContext.Response.Body)){return new HtmlString(reader.ReadToEnd());}}catch (Exception ex){return new HtmlString(ex.Message);}finally{actionContextAccessor.ActionContext originalActionContext;httpContextAccessor.HttpContext originalhttpContext;if (helper.ViewContext.HttpContext.Items.ContainsKey(typeof(IUrlHelper))){helper.ViewContext.HttpContext.Items.Remove(typeof(IUrlHelper));}}}}}它基于白羊座的反应。我更正了2.0版未编译的内容并添加了一些调整。当前的httpcontext和当前的actioncontext有2个美化的静态值。在httpcontext中IHttpContextFactory.Create设置了一个在代码中设置了actioncontext。请注意这取决于你使用的功能IActionContextAccessor并IHttpContextAccessor可能不会被默认注册所以你可能需要将其添加在启动services.AddSingleton();services.AddSingleton();HttpContext只是一个包装器HttpContext.Features因此如果您在其中一个进行更改则在另一个中也进行更改…我将在try/ catch的最后部分重设我所了解的内容。我IUrlHelper从Items缓存中删除了因为即使构建urlHelper的actionContext不同该值也将被重用IUrlHelperFactory.GetUrlHelper。Asp.net Core 2.0假设您不会这样做那么很有可能还有其他缓存的东西因此我建议在使用此方法时要格外小心如果不需要请不要这样做。2020-05-19