我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ASP.NET MVC Controller激活系统怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ASP.NET MVC Controller激活系统怎么实现

本篇内容主要讲解“ASP.NET MVC Controller激活系统怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET MVC Controller激活系统怎么实现”吧!

一、Controller

我们知道作为Controller的类型直接或者间接实现了IController接口。如下面的代码片断所示,IController接口仅仅包含一个参数类型为RequestContext的Execute方法。当一个Controller对象被激活之后,核心的操作就是根据请求上下文解析出目标Action方法,并通过Model绑定机制从请求上下文中提取相应的数据映射为方法的参数并最终执行Action方法。所有的这些操作都是调用这个Execute方法来执行的。

public interface IController  {      void Execute(RequestContext requestContext);

定义在IController接口中的Execute是以同步的方式执行的。为了支持以异步方式对请求的处理,IController接口的异步版本System.Web.Mvc.IAsyncController被定义出来。如下面的代码片断所示,实现了IAsyncController接口的异步Controller的执行通过BeginExecute/EndExecute方法组合来完成。

public interface IAsyncController : IController     {         IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state);        void EndExecute(IAsyncResult asyncResult);      }

抽象类ControllerBase实现了IController接口,它具有如下几个重要的属性。TemplateData、ViewBag和ViewData用于存储从Controller向View传递的数据或者变量。其中TemplateData和ViewData具有基于字典的数据结构,Key和Value分别表示变量的名称和值,所不同的前者用于存储基于当前HTTP上下文的变量(在完成当前请求后,存储的数据会被回收)。ViewBag和ViewData具有相同的作用,甚至对应着相同的数据存储,它们之间的不同之处在于前者是一个动态对象,我们可以为其指定任意属性。

public abstract class ControllerBase : IController  {         //其他成员     public ControllerContext ControllerContext { get; set; }      public TempDataDictionary TempData { get; set; }      public object ViewBag { [return: Dynamic] get; }     public ViewDataDictionary ViewData { get; set; }

在ASP.NET MVC中我们会陆续遇到一系列的上下文(Context)对象,之前我们已经对表示请求上下文的RequestContext(HttpContext + RouteData)进行了详细的介绍,现在我们来介绍另一个具有如下定义的上下文类型ControllerContext。

public class ControllerContext   {       //其他成员       public ControllerContext();       public ControllerContext(RequestContext requestContext, ControllerBase controller);      public ControllerContext(HttpContextBase httpContext,        RouteData routeData, ControllerBase controller);       public virtual ControllerBase Controller { get; set; }     public RequestContext RequestContext { get; set; }      public virtual HttpContextBase HttpContext { get; set; }      public virtual RouteData RouteData { get; set; }  }

顾名思义,ControllerContext就是基于某个Controller对象的上下文。从如下的代码所示,ControllerContext是实际上是对一个Controller对象和RequestContext的封装,这两个对象分别对应着定义在ControllerContext中的同名属性,并且可以在构造函数中被初始化。而通过属性HttpContext和RouteData属性返回的HttpContextBase和RouteData对象在默认情况下实际上就是组成RequestContext的核心元素。ControllerContext的这四个属性都是可读可写的,我们对其进行任意地修改。当ControllerBase的Execute方法被执行的时候,它会根据传入的ReuqestContext创建ControllerContext对象,而后续的操作可以看成是在该上下文中进行。

当我们在进行开发的时候,通过VS默认创建的Controller类型实际上继承自抽象类Controller。该类型中定义了很多的辅助方法和属性以编程变得简单。如下面的代码片断所示,除了直接继承ControllerBase之外,Controller类型还显式实现了IController和IAsyncController接口,以及代表ASP.NET MVC 四大筛选器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter)的4个接口。

public abstract class Controller :        ControllerBase,             IController,       IAsyncController,       IActionFilter,        IAuthorizationFilter,        IExceptionFilter,       IResultFilter,         IDisposable,      ...  {     //省略成员  }

二、 ControllerFactory

ASP.NET MVC为Controller的激活定义相应的相应的工厂,我们将其统称为ControllerFactory,所有的ControllerFactory实现了接口IControllerFactory接口。如下面的代码片断所示,Controller对象的激活最终最终通过IControllerFactory的CreateController方法来完成,该方法的两个参数分别表示当前请求上下文和从路由信息中获取的Controller的名称(最初来源于请求地址)。

public interface IControllerFactory   {      IController CreateController(RequestContext requestContext, string controllerName);      SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName);      void ReleaseController(IController controller);   }  public enum SessionStateBehavior        Default,     Required,     ReadOnly,     Disabled  }

处理负责创建Controller处理请求之前,ControllerFactory还需要在完成请求处理之后实施对Controller的释放回收,后者实现在ReleaseController方法中。IControllerFactory的另一个方法GetControllerSessionBehavior方法返回一个SessionStateBehavior枚举。熟悉ASP.NET的读者应该对SessionStateBehavior不会感到陌生,它用于表示请求处理过程中会话状态支持的模式,它的四个枚举值分别具有如下的含义:

  • Default:使用默认 ASP.NET 逻辑来确定请求的会话状态行为。

  • Required:为请求启用完全的读写会话状态行为。

  • ReadOnly:为请求启用只读会话状态。

  • Disabled:禁用会话状态。

对于Default选项来说,ASP.NET通过映射的HttpHandler类型是否实现了相关接口来决定具体的会话状态控制行为。在System.Web.SessionState命名空间下定义了IRequiresSessionState和IRequiresSessionState接口,如下面的代码片断所示,这两个都是不具有任何成员的空接口(我们一般称之为标记接口),而IReadOnlySessionState继承自IRequiresSessionState。如果HttpHandler实现了接口IReadOnlySessionState,则意味着采用ReadOnly模式,如果只实现了IRequiresSessionState则采用Required模式。

   1: public interface IRequiresSessionState
   2: {}
   3: public interface IReadOnlySessionState : IRequiresSessionState
   4: {}

具体采用何种会话状态行为取决于当前HTTP上下文(HttpContext.Current)。对于之前的版本,我们不能对当前HTTP上下文的会话状态行为模式进行动态的修改,ASP.NET 4.0为HttpContext定义了如下一个SetSessionStateBehavior方法是我们可以自由地选择会话状态行为模式。相同的方法同样定义在HttpContextBase中,它的子类HttpContextWrapper重写了这个方法并在内部会调用封装的HttpContext的同名方法。

public sealed class HttpContext : IServiceProvider, IPrincipalContainer   {      //其他成员   public void SetSessionStateBehavior(       SessionStateBehavior sessionStateBehavior);   }   public class HttpContextBase: IServiceProvider   {      //其他成员      public void SetSessionStateBehavior(SessionStateBehavior sessionStateBehavior);  }

三、ControllerBuilder

用于激活Controller对象的ControllerFactory最终通过ControllerBuilder注册到ASP.NET MVC应用中。如下面的代码所示,ControllerBuilder定义了一个静态只读属性Current返回当前ControllerBuilder对象,这是针对整个Web应用的全局对象。两个SetControllerFactory方法重载用于注册ControllerFactory的类型或者实例,而GetControllerFactory方法返回一个具体的ControllerFactory对象。

public class ControllerBuilder       public IControllerFactory GetControllerFactory();     public void SetControllerFactory(Type controllerFactoryType);      public void SetControllerFactory(IControllerFactory controllerFactory);        public HashSet<string> DefaultNamespaces { get; }     public static ControllerBuilder Current { get; }  }

具体来说,如果我们是注册的ControllerFactory的类型,那么GetControllerFactory在执行的时候会通过对注册类型的反射(调用Activator的静态方法CreateInstance)来创建具体的ControllerFactory(系统不会对创建的Controller进行缓存);如果注册的是一个具体的ControllerFactory对象,该对象直接从GetControllerFactory返回。

被ASP.NET路由系统进行拦截处理后会生成一个用于封装路由信息的RouteData对象,而目标Controller的名称就包含在通过该RouteData的Values属性表示的RouteValueDisctionary对象中,对应的Key为“controller”。而在默认的情况下,这个作为路由数据的名称只能帮助我们解析出Controller的类型名称,如果我们在不同的命名空间下定义了多个同名的Controller类,会导致激活系统无法确定具体的Controller的类型从而抛出异常。

为了解决这个问题,我们必须为定义了同名Controller类型的命名空间设置不同的优先级,具体来说我们有两种提升命名空间优先级的方式。***种方式就是在调用RouteCollection的扩展方法MapRoute时指定一个命名空间的列表。通过这种方式指定的命名空间列表会保存在Route对象的DataTokens属性表示的RouteValueDictionary字典中,对应的Key为“Namespaces”。

public static class RouteCollectionExtensions   {       //其他成员             public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);           public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);           public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);   }

而另一种提升命名空间优先级的方式就是将其添加到当前的ControllerBuilder中的默认命名空间列表中。从上面的给出的ControllerBuilder的定义可以看出,它具有一个HashSet<string>类型的只读属性DefaultNamespaces就代表了这么一个默认命名空间列表。对于这两种不同的命名空间优先级提升方式,前者(通过路由注册)指定命名空间具有更高的优先级。

实例演示:如何提升命名空间的优先级

为了让读者对此如何提升命名空间优先级具有一个深刻的印象,我们来进行一个简单的实例演示。我们使用Visual Studio提供的项目模板创建一个空的ASP.NET MVC应用,并且使用如下所示的默认路由注册代码。

 public class MvcApplication : System.Web.HttpApplication   {       public static void RegisterRoutes(RouteCollection routes)       {                 routes.MapRoute(               name: "Default",               url: "{controller}/{action}/{id}",               defaults: new { controller = "Home", action = "Index",                    id = UrlParameter.Optional }          );     }      protected void Application_Start()      {          //其他操作          RegisterRoutes(RouteTable.Routes);      }  }  public class MvcApplication : System.Web.HttpApplication  {      public static void RegisterRoutes(RouteCollection routes)      {                routes.MapRoute(              name: "Default",              url: "{controller}/{action}/{id}",              defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }          );      }      protected void Application_Start()      {          //其他操作          RegisterRoutes(RouteTable.Routes);      }  }

然后我们在Controllers目录下添加一个.cs 文件,并在该文件中定义两个同名的Controller类。如下面的代码片断所示,这两个HomeCotroller类分别定义在命名空间Artech.MvcApp和Artech.MvcApp.Controllers之中,而Index操作返回的是一个将Controller类型全名为内容的ContentResult对象。

 namespace Artech.MvcApp.Controllers   {       public class HomeController : Controller       {           public ActionResult Index()           {               return this.Content(this.GetType().FullName);           }       }   namespace Artech.MvcApp  {      public class HomeController : Controller     {          public ActionResult Index()         {             return this.Content(this.GetType().FullName);         }     }

现在我们直接运行该Web应用。由于具有多个Controller与注册的路由规则相匹配导致ASP.NET MVC的Controller激活系统无法确定目标哪个类型的Controller应该被选用,所以会出现如下图所示的错误。

ASP.NET MVC Controller激活系统怎么实现

目前定义了HomeController的两个命名空间具有相同的优先级,现在我们将其中一个定义在当前ControllerBuilder的默认命名空间列表中以提升匹配优先级。如下面的代码片断所示,在Global.asax 的Application_Start方法中,我们将命名空间“Artech.MvcApp.Controllers”添加到当前ControllerBuilder的DefaultNamespaces属性所示的命名空间列表中。

   1: public class MvcApplication : System.Web.HttpApplication
   2: {
   3:     protected void Application_Start()
   4:     {
   5:         //其他操作
   6:         ControllerBuilder.Current.DefaultNamespaces.Add("Artech.MvcApp.Controllers");
   7:     }
   8: }

对用同时匹配注册的路由规则的两个HomeController,由于“Artech.MvcApp.Controllers”命名空间具有更高的匹配优先级,所有定义其中的HomeController会被选用,这可以通过如下图所示的运行结果看出来。

ASP.NET MVC Controller激活系统怎么实现

为了检验在路由注册时指定的命名空间和作为当前ControllerBuilder的命名空间哪个具有更高匹配优先级,我们修改定义在Global.asax中的路由注册代码。如下面的代码片断所示,我们在调用RouteTable的静态属性Routes的MapRoute方法进行路由注册的时候指定了命名空间(“Artech.MvcApp”)。

public class MvcApplication : System.Web.HttpApplication  {      public static void RegisterRoutes(RouteCollection routes)      {                routes.MapRoute(              name: "Default",              url: "{controller}/{action}/{id}",              defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },              namespaces:new string[]{"Artech.MvcApp"}         );     }      protected void Application_Start()    {        //其他操作        RegisterRoutes(RouteTable.Routes);        ControllerBuilder.Current.DefaultNamespaces.Add("Artech.MvcApp.Controllers");     }

再次运行我们的程序会在浏览器中得到如图3-3所示的结果,从中可以看出定义在命名空间“Artech.MvcApp”中的HomeController被最终选用,可见较之作为当前ControllerBuilder的默认命名空间,在路由注册过程中执行的命名空间具有更高的匹配优先级,前者可以视为后者的一种后备。

ASP.NET MVC Controller激活系统怎么实现

在路由注册时指定的命名空间比当前ControllerBuilder的默认命名空间具有更高的匹配优先级,但是对于这两个集合中的所有命名空间却具有相同的匹配优先级。换句话说,用于辅助解析Controller类新的命名空间分为三个梯队,简称为路由命名空间、ConrollerBuilder命名空间和Controller类型命名空间,如果前一个梯队不能正确解析出目标Controller的类型,则将后一个梯队的命名空间作为后备;反之,如果根据某个梯队的命名空间进行解析得到多个匹配的Controller类型,会直接抛出异常。

现在我们对本例的路由注册代码作了如下的修改,为注册的路由对象指定了两个命名空间(分别是两个HomeContrller所在的命名空间),运行我们的程序依然会得到如***张图所示的错误。

 public class MvcApplication : System.Web.HttpApplication   {       public static void RegisterRoutes(RouteCollection routes)       {                 routes.MapRoute(               name: "Default",               url: "{controller}/{action}/{id}",               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },               namespaces: new string[] { "Artech.MvcApp", "Artech.MvcApp.Controllers" }          );      }      protected void Application_Start()    {          //其他操作       RegisterRoutes(RouteTable.Routes);     }  }

针对Area的路由对象的命名空间

针对某个Area的路由映射是通过相应的AreaRegistration进行注册的,具体来说是在AreaRegistration的RegisterArea方法中调用AreaRegistrationContext对象的MapRoute方法进行注册的。如果在调用MapRoute方法中指定了表示命名空间的字符串,将自动作为注册的路由对象的命名空间,否则会将表示AreaRegistration所在命名空间的字符串加上“.*”后缀作为路由对象的命名空间。这里所说的“路由对象的命名空间”指的就是通过Route对象的DataTokens属性表示的RouteValueDictionary对象中Key为“Namespaces”的字符串数组,而该字符串最终会转移到生成的RouteData的DataTokens中。

除此之外,在调用AreaRegistrationContext的MapRoute方法时还会在注册Route对象DataTokens中添加一个Key为“UseNamespaceFallback”的条目表示是否采用后备命名空间对Controller类型进行解析。如果注册对象具有命名空间(调用MapRoute方法时指定了命名空间或者对应的AreaRegistration类型定义在某个命名空间中),该条目的值为False;否则为True。该条目同样反映在通过该Route对象生成的RouteData对象的DataTokens属性中。[关于ASP.NET MVC路由,在我的文章《ASP.NET MVC路由扩展:路由映射》中具有详细的介绍]

在解析Controller真实类型的过程中,会先通过RouteData包含的命名空间来解析Controller类型。如果Controller类型解析失败,则通过包含在通过RouteData的DataTokens属性表示的RouteValueDictionary对象中的这个UseNamespaceFallback值来判断是否使用“后备”命名空间进行解析。具体来说,如果该值为True或者不存在,则先通过当前ControllerBuilder的命名空间解析,如果失败则忽略命名空间直接采用类型名称进行匹配;否则直接因找不到匹配的Controller而抛出异常。

我们通过具体的例子来说明这个问题。在一个通过Visual Studio的ASP.NET MVC项目创建的空Web应用中,我们添加一个名称为Admin的Area,此时IDE会默认为我们添加如下一个AdminAreaRegistration类型。

   1: namespace Artech.MvcApp.Areas.Admin
   2: {
   3:     public class AdminAreaRegistration : AreaRegistration
   4:     {
   5:         public override string AreaName
   6:         {
   7:             get{return "Admin";}
   8:         }
   9:         public override void RegisterArea(AreaRegistrationContext context)
  10:         {
  11:             context.MapRoute("Admin_default", "Admin/{controller}/{action}/{id}",
  12:                 new { action = "Index", id = UrlParameter.Optional }
  13:             );
  14:         }
  15:     }
  16: }

AdminAreaRegistration类型定义在命名空间Artech.MvcApp.Areas.Admin中。现在我们在该Area中添加一个Controller类,其名为HomeController。默认情况下,我们添加的Controller类型和AdminAreaRegistration具有相同的命名空间,但是现在我们刻意将命名空间改为Artech.MvcApp.Areas。

namespace Artech.MvcApp.Areas  {      public class HomeController : Controller      {          public ActionResult Index()          {              return Content("...");          }      }

现在我们在浏览器中通过匹配的URL(/Admin/Home/Index)来访问Area为Admin的HomeController的Index操作,会得到如下图所示的HTTP状态为404的错误。这就是因为在对Controller类型进行解析的时候是严格按照对应的AreaRegistration所在命名空间来进行的,很显然在这个范围内是不可能找得到对应的Controller类型的。

ASP.NET MVC Controller激活系统怎么实现

四、Controller的激活与URL路由

ASP.NET路由系统是HTTP请求抵达服务端的***道屏障,它根据注册的路由规则对拦截的请求进行匹配并解析包含目标Controller和Action名称的路由信息。而当前ControllerBuilder具有用于激活Controller对象的ControllerFactory,我们现在看看两者是如何结合起来的。

通过《ASP.NET路由系统实现原理:HttpHandler的动态映射》介绍我们知道ASP.NET路由系统的核心是一个叫做UrlRoutingModule的自定义HttpModule,路由的实现是它通过注册代表当前Web应用的HttpApplication的PostResolveRequestCache事件对HttpHandler的动态映射来实现的。具体来说,它通过以RouteTable的静态属性Routes代表的全局路由表对请求进行匹配并得到一个RouteData对象。RouteData具有一个实现了接口IRouteHandler的属性RouteHandler,通过该属性的GetHttpHandler方法得到最终被映射到当前请求的HttpHandler。

对于ASP.NET MVC应用来说,RouteData的RouteHandler属性类型为MvcRouteHandler,体现在MvcRouteHandler类型上关于HttpHandler的提供机制基本上(不是完全等同)可以通过如下的代码来表示。MvcRouteHandler维护着一个ControllerFactory对象,该对象可以在构造函数中指定,如果没有显示指定则直接通过调用当前ControllerBuilder的GetControllerFactory方法获取。

 public class MvcRouteHandler : IRouteHandler   {       private IControllerFactory _controllerFactory;        public MvcRouteHandler(): this(ControllerBuilder.Current.GetControllerFactory())       { }       public MvcRouteHandler(IControllerFactory controllerFactory)      {          _controllerFactory = controllerFactory;      }      IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)     {         string controllerName = (string)requestContext.RouteData.GetRequiredString("controller");         SessionStateBehavior sessionStateBehavior = _controllerFactory.GetControllerSessionBehavior(requestContext, controllerName);          requestContext.HttpContext.SetSessionStateBehavior(sessionStateBehavior);            return new MvcHandler(requestContext);      }  }

在用于提供HttpHandler的GetHttpHandler方法中,除了返回一个实现了IHttpHandler接口的MvcHandler对象之外,还需要对当前HTTP上下文的会话状态行为模式进行设置。具体来说,首先通过包含在传入RequestContext的RouteData对象得到Controller的名称,该名称连同RequestContext对象一起传入ControllerFactory的GetControllerSessionBehavior方法得到一个类型为SessionStateBehavior的枚举。***通过RequestContext得到表示当前HTTP上下文的HttpContextBase对象(实际上是一个HttpContextWrapper对象)并调用其SetSessionStateBehavior方法。

绍我们知道RouteData中的RouteHandler属性最初来源于对应的Route对象的同名属性,而当我们调用RouteCollection的扩展方法MapRoute方法时,其内部会直接创建并添加一个Route对象。由于在创建Route对象是并没有显式指定ControllerFactory,所以通过当前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory默认被使用。

通过当前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory仅仅用于获取会话状态行为模式,而MvcHandler真正将它用于创建Controller。MvcHandler中关于对请求处理的逻辑基本上可以通过如下的代码片断来体现。如下面的代码片断所示,MvcHandler具有一个表示当前请求上下文的RequestContext属性,该属性在构造函数中被初始化。

public class MvcHandler : IHttpHandler  {      public RequestContext RequestContext { get; private set; }     public bool IsReusable      {          get { return false; }      }     public MvcHandler(RequestContext requestContext)      {         this.RequestContext = requestContext;     }     public void ProcessRequest(HttpContext context)     {         IControllerFactory controllerFactory = ControllerBuilder.Current.GetControllerFactory();         string controllerName = this.RequestContext.RouteData.GetRequiredString("controller");         IController controller = controllerFactory.CreateController(this.RequestContext, controllerName);        try        {             controller.Execute(this.RequestContext);         }         finally       {            controllerFactory.ReleaseController(controller);        }     }  : }

在ProcessRequest方法中,通过RequestContext对象得到目标Controller的名称,并通过它利用当前ControllerBuilder创建的ControllerFactory激活Controller对象。在执行了被激活Controller对象的Execute方法之后调用ControllerFactory的ReleaseController对其进行释放清理工作。

到此,相信大家对“ASP.NET MVC Controller激活系统怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ASP.NET MVC Controller激活系统怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ASP.NET MVC Controller激活系统怎么实现

本篇内容主要讲解“ASP.NET MVC Controller激活系统怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET MVC Controller激活系统怎么实现”吧!一、
2023-06-17

win8系统如何激活 怎么激活win8系统

Win8操作系统采用了全新的激活机制,使得大家在激活Win 8操作系统的时候很是麻烦,但是由于微软有一个电话激活操作系统的机制,因此使得我们激活Win8操作系统有了新的转机,这里我将以最详细的步骤向大家讲解一下怎么使用电话激活Win 8操作
2022-06-04

win9怎么激活?windows9系统激活方法

win9激活教程大家想知道吗?下文将告诉大家激活Windows9系统方法,微软将对Win9采用全新激活机制,具体该如编程客栈何操作http://www.cppcns.com呢?有需要的朋友请看下文吧。 例如普通消费者通过RETAIL零售商
2023-06-05

win7系统怎么激活

要激活Win7系统,您可以按照以下步骤操作:1. 打开“开始”菜单,选择“计算机”。2. 在计算机窗口中,单击右键并选择“属性”。3. 在属性窗口中,向下滚动到“Windows激活”部分。4. 单击“更改产品密钥”链接。5. 在弹出的“产品
2023-08-28

怎么激活windows7系统

小编给大家分享一下怎么激活windows7系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!激活windows7系统的方法:首先在计算机内找到暴风激活工具选项,并
2023-06-08

win10中kms激活秘钥怎么激活系统

这篇文章主要介绍win10中kms激活秘钥怎么激活系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!win10家庭版密钥1、windows10家庭版oem序列号:Win 10 Core OEM:NONSLP:46J3
2023-06-10

怎么使用kms激活秘钥激活系统

小编给大家分享一下怎么使用kms激活秘钥激活系统 ,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如何使用kms激活秘钥激活系统?使用slmgr kms激活win1
2023-06-10

怎么激活win11系统?win11激活密钥+激活工具分享

怎么激活win11?win11激活密钥怎么获取?哪款激活工具可以激活win11系统?Win11预览版提前泄露发布!很多用户已经开始测试win11了,但是很多用户还不知道怎么激活win11,所以今天我们小编给大家分享最新的win11系统激活密
2023-05-23

Win10系统office2013怎么激活

要激活Windows 10系统上的Office 2013,你可以按照以下步骤进行操作:1. 首先,确保你的Office 2013已经安装在Windows 10系统上。2. 打开任意一个Office 2013的应用程序,比如Word或Exce
2023-09-14

w7系统怎么使用激活工具进行激活

随着科技的快速发展,网络的广泛性,越来越多的人都开始使用电脑,虽然现在已经有很多操作系统,但使用win7操作系统的用户仍然占据着很大一部分,因为win7操作系统相较于其它的操作系统使用起来会更加方便。接下来,我们来了解一下如何使用w7系统激
2023-07-24

win7系统怎么激活 常用的win7激活方法整理

对于win7怎么激活,这一直是个大热门,方法也是五花八门,多种多样的,让人有点眼花缭乱的感觉,下面我们小编格子整理了一些wfSVnqbgin7的激活方法,供您参考。 Win7怎么激活 五种常用的Win7激活方法 1、先说说大家最常用的软激吧
2023-05-30

win10系统不激活会怎么样

如果Windows 10系统不激活,以下情况可能会发生:1. 桌面背景和主题无法更改:未激活的Windows 10系统将无法自定义桌面背景和主题,只能使用系统默认的设置。2. 功能受限:部分高级功能可能无法使用,如个性化设置、屏幕保护程序、
2023-08-31

教大家win8系统怎么激活

如今众多电脑操作系统中,win8系统也依然有网友在使用着,很多小伙伴在购买新电脑后也安装了windows8,但是对于Win8系统的激活问题一直都困扰着我们。今天小编就与大家分享一下激活windows8系统的方法。1、右击桌面,从弹出的菜单中
2023-07-10

win7系统专业版该怎么激活

目前,win7系统仍然是使用者最多的一款系统,对于新安装的win7的系统,很多都是出于未激活的状态的,这让用户使用起来相当麻烦,那么有什么办法激活呢?下面,小编就给大家介绍win7专业版激活的方法。1、按快捷键打开win + R 打开运行菜
2023-07-10

win10系统激活工具怎么用 win10破解激活方法教程

win10体验版激活的话功能体验并不全面,我们可以借用win10激活工具来实现,win10系统激活工具怎么用?其实很简单,下面就为大家带来win10破解激活方法教程。 win10激活工具kmspico 10.3.2 最新安装版类型:系统其它
2023-06-14

Mac OS X 10.9 Mavericks系统怎么激活

要激活Mac OS X 10.9 Mavericks系统,您可以按照以下步骤操作:1. 打开Mac电脑并连接到互联网。2. 在屏幕左上角的苹果菜单中,选择“系统偏好设置”。3. 在弹出的窗口中,选择“App Store”。4. 在App S
2023-08-31

如何用ASP.NET MVC 3实现一个访问统计系统

本篇文章为大家展示了如何用ASP.NET MVC 3实现一个访问统计系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。运营网站,我们经常需要分析用户的行为、用户的习惯,用户看重网站的哪一部分,哪一部
2023-06-17

Win8.1系统明明已经激活却一直提示激活怎么办?Win8.1已激活却提示激活的解决方法

有一些朋友发现,自己的Win8.1系统明明已经激活了,可是还是经常提示让我们激活,遇到这样的情况该如何解决呢?下面编程网的小编为大家解答解决方法。故障原因分析:出现这个问题可能是微软需要再次验证你的激活码,只要重新激活就可以了。解决方法:1
2022-06-04

迷你KMS怎么激活Win8.1系统 Win8.1激活详细图文教程(附win8.1kms激活工具下载)

摘要:本文为大家介绍的是如何使用迷你KMS工具激活Win8.javascript1系统,具体步骤如下:android 1、下载Win8.1激活软件,这里介绍的是“迷你KMS工具”大家可以点击下载。 相关链接:Win8
2023-06-03

ASP.NET Core MVC中怎么实现过滤器

本篇内容介绍了“ASP.NET Core MVC中怎么实现过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器如何工作?过滤器在 MV
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录