Maison développement back-end Tutoriel C#.Net asp.net core mvc implémente une fonction pseudo-statique

asp.net core mvc implémente une fonction pseudo-statique

Feb 20, 2017 pm 05:00 PM

Cet article présente principalement les informations pertinentes d'asp.net core mvc pour implémenter en détail la fonction pseudo-statique. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Dans les grands systèmes de sites Web. Pour améliorer les performances d'accès au système, certains contenus peu fréquents sont souvent publiés sous forme de pages statiques, comme la page de détails des produits du centre commercial et la page de détails des actualités. Une fois ces informations publiées, la fréquence des modifications ne sera pas très élevée si vous les utilisez toujours. S'il est traité via une sortie dynamique, cela entraînera certainement un énorme gaspillage de ressources sur le serveur. Mais nous ne pouvons pas créer indépendamment des pages statiques pour ces contenus, nous pouvons donc utiliser un traitement pseudo-statique dans le système. Quant à ce qu'est le pseudo-statique, vous pouvez le rechercher sur Baidu. Présentons ici comment implémenter le pseudo-statique dans asp.net core mvc.

Dans le framework MVC, la vue représente la vue, et le résultat de son exécution est le contenu finalement envoyé au navigateur client, y compris html, css, js, etc. Si nous voulons obtenir la statique, nous devons enregistrer le résultat de l'exécution de la vue en tant que fichier statique et l'enregistrer dans un emplacement spécifié, tel qu'un disque, un cache distribué, etc., afin de pouvoir lire directement le contenu enregistré la prochaine fois. accédez-y. Pas besoin d’exécuter à nouveau la logique métier. Alors, que devrait faire asp.net core mvc pour obtenir une telle fonction ? La réponse est d'utiliser des filtres. Dans le framework MVC, plusieurs types de filtres sont fournis. Ici, nous allons utiliser des filtres d'action qui fournissent deux moments : avant l'exécution de l'action et après l'exécution de l'action. Nous pouvons d'abord déterminer si la page statique a été générée avant l'exécution de l'action. Si elle a été générée, nous pouvons directement lire le contenu du fichier et le sortir, et la logique suivante sera ignorée. S'il n'y a pas de production, continuez à descendre, capturez les résultats à ce stade une fois l'action exécutée, puis enregistrez le contenu statique généré par les résultats.

Venons-en ensuite au code d'implémentation spécifique. Nous définissons d'abord un type de filtre, que nous appelons StaticFileHandlerFilterAttribute. Cette classe est dérivée du ActionFilterAttribute fourni dans le framework. OnActionExecuted (Après l'exécution de l'action), OnActionExecuting (avant l'exécution de l'action), le code spécifique est le suivant :

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class StaticFileHandlerFilterAttribute : ActionFilterAttribute
{
   public override void OnActionExecuted(ActionExecutedContext context){}
   public override void OnActionExecuting(ActionExecutingContext context){}
}
Copier après la connexion

Dans OnActionExecuting, vous Il faut déterminer si le contenu statique a été généré. Si un contenu de sortie directe a été généré, l'implémentation logique est la suivante :

//按照一定的规则生成静态文件的名称,这里是按照area+"-"+controller+"-"+action+key规则生成
string controllerName = context.RouteData.Values["controller"].ToString().ToLower();
string actionName = context.RouteData.Values["action"].ToString().ToLower();
string area = context.RouteData.Values["area"].ToString().ToLower();
//这里的Key默认等于id,当然我们可以配置不同的Key名称
string id = context.RouteData.Values.ContainsKey(Key) ? context.RouteData.Values[Key].ToString() : "";
if (string.IsNullOrEmpty(id) && context.HttpContext.Request.Query.ContainsKey(Key))
{
  id = context.HttpContext.Request.Query[Key];
}
string filePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", area, controllerName + "-" + actionName + (string.IsNullOrEmpty(id) ? "" : ("-" + id)) + ".html");
//判断文件是否存在
if (File.Exists(filePath))
{
  //如果存在,直接读取文件
  using (FileStream fs = File.Open(filePath, FileMode.Open))
  {
    using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
    {
       //通过contentresult返回文件内容
       ContentResult contentresult = new ContentResult();
       contentresult.Content = sr.ReadToEnd();
       contentresult.ContentType = "text/html";
       context.Result = contentresult;
    }
  }
}
Copier après la connexion

Dans OnActionExecuted, nous avons besoin du résultat de l'action pour déterminer si le type de résultat de l'action est un ViewResult. Si le résultat est exécuté via du code, le résultat est obtenu et une page statique est générée selon les mêmes règles que ci-dessus.

//获取结果
IActionResult actionResult = context.Result;
 //判断结果是否是一个ViewResult
    if (actionResult is ViewResult)
    {
      ViewResult viewResult = actionResult as ViewResult;
      //下面的代码就是执行这个ViewResult,并把结果的html内容放到一个StringBuiler对象中
      var services = context.HttpContext.RequestServices;
      var executor = services.GetRequiredService<ViewResultExecutor>();
      var option = services.GetRequiredService<IOptions<MvcViewOptions>>();
      var result = executor.FindView(context, viewResult);
      result.EnsureSuccessful(originalLocations: null);
      var view = result.View;
      StringBuilder builder = new StringBuilder();
 
      using (var writer = new StringWriter(builder))
      {
        var viewContext = new ViewContext(
          context,
          view,
          viewResult.ViewData,
          viewResult.TempData,
          writer,
          option.Value.HtmlHelperOptions);
 
        view.RenderAsync(viewContext).GetAwaiter().GetResult();
        //这句一定要调用,否则内容就会是空的
        writer.Flush();
      }
      //按照规则生成静态文件名称
      string area = context.RouteData.Values["area"].ToString().ToLower();
      string controllerName = context.RouteData.Values["controller"].ToString().ToLower();
      string actionName = context.RouteData.Values["action"].ToString().ToLower();
      string id = context.RouteData.Values.ContainsKey(Key) ? context.RouteData.Values[Key].ToString() : "";
      if (string.IsNullOrEmpty(id) && context.HttpContext.Request.Query.ContainsKey(Key))
      {
        id = context.HttpContext.Request.Query[Key];
      }
      string devicedir = Path.Combine(AppContext.BaseDirectory, "wwwroot", area);
      if (!Directory.Exists(devicedir))
      {
        Directory.CreateDirectory(devicedir);
      }
 
      //写入文件
      string filePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", area, controllerName + "-" + actionName + (string.IsNullOrEmpty(id) ? "" : ("-" + id)) + ".html");
      using (FileStream fs = File.Open(filePath, FileMode.Create))
      {
        using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
        {
          sw.Write(builder.ToString());
        }
      }
      //输出当前的结果
      ContentResult contentresult = new ContentResult();
      contentresult.Content = builder.ToString();
      contentresult.ContentType = "text/html";
      context.Result = contentresult;
    }
Copier après la connexion

Clé mentionnée ci-dessus, on ajoute directement l'attribut correspondant

public string Key
{
  get;set;
}
Copier après la connexion

Nous pouvons donc utiliser ce filtre, la méthode d'utilisation : dans le contrôleur ou la méthode du contrôleur Ajoutez la fonctionnalité [StaticFileHandlerFilter] Si vous souhaitez configurer différentes clés, vous pouvez utiliser [StaticFileHandlerFilter(Key="set value")]<. 🎜>

La statique a été mise en œuvre. Nous devons encore envisager les mises à jour. Si l'arrière-plan Après la mise à jour d'un article, nous devons également mettre à jour la page statique. Il existe de nombreuses solutions : l'une consiste à supprimer la page statique correspondante de manière synchrone. le contenu est mis à jour en arrière-plan. Nous en introduisons ici une autre, la mise à jour programmée, ce qui signifie que la page statique a une certaine période de validité et est automatiquement mise à jour après cette période de validité. Pour implémenter cette logique, nous devons obtenir l'heure de création de la page statique dans la méthode OnActionExecuting, puis la comparer avec l'heure actuelle pour déterminer si elle a expiré. Si elle n'a pas expiré, le contenu sera affiché directement si. il a expiré, continuez à exécuter la logique suivante. Le code spécifique est le suivant :

//获取文件信息对象
FileInfo fileInfo=new FileInfo(filePath);
//结算时间间隔,如果小于等于两分钟,就直接输出,当然这里的规则可以改
TimeSpan ts = DateTime.Now - fileInfo.CreationTime;
if(ts.TotalMinutes<=2)
{
  using (FileStream fs = File.Open(filePath, FileMode.Open))
  {
    using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
    {
      ContentResult contentresult = new ContentResult();
      contentresult.Content = sr.ReadToEnd();
      contentresult.ContentType = "text/html";
      context.Result = contentresult;
    }
  }
}
Copier après la connexion

À ce stade, la pseudo-statique est atteinte. La méthode de traitement actuelle ne peut améliorer les performances d'accès que dans une certaine mesure, mais elle pourrait ne pas suffire pour les grands systèmes de portail. Selon la méthode présentée ci-dessus, d'autres extensions fonctionnelles peuvent être réalisées. Par exemple, après avoir généré une page statique, elle peut être publiée sur un CDN, ou elle peut être publiée sur un serveur de contenu distinct, etc. Quelle que soit la méthode utilisée, l’idée de mise en œuvre est la même.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles liés à asp.net core mvc implémentant des fonctions pseudo-statiques, veuillez faire attention au site Web PHP chinois !

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment gérer les caractères spéciaux dans la langue C Comment gérer les caractères spéciaux dans la langue C Apr 03, 2025 pm 03:18 PM

Dans le langage C, les caractères spéciaux sont traités à travers des séquences d'échappement, telles que: \ n représente les pauses de ligne. \ t signifie le caractère d'onglet. Utilisez des séquences d'échappement ou des constantes de caractères pour représenter des caractères spéciaux, tels que char c = '\ n'. Notez que l'arrière-plan doit être échappé deux fois. Différentes plates-formes et compilateurs peuvent avoir différentes séquences d'échappement, veuillez consulter la documentation.

Quel est le rôle de char dans les chaînes C Quel est le rôle de char dans les chaînes C Apr 03, 2025 pm 03:15 PM

En C, le type de char est utilisé dans les chaînes: 1. Stockez un seul caractère; 2. Utilisez un tableau pour représenter une chaîne et se terminer avec un terminateur nul; 3. Faire fonctionner via une fonction de fonctionnement de chaîne; 4. Lisez ou sortant une chaîne du clavier.

La différence entre char et wchar_t dans le langage C La différence entre char et wchar_t dans le langage C Apr 03, 2025 pm 03:09 PM

Dans le langage C, la principale différence entre Char et WCHAR_T est le codage des caractères: Char utilise ASCII ou étend ASCII, WCHAR_T utilise Unicode; Char prend 1 à 2 octets, WCHAR_T occupe 2-4 octets; Char convient au texte anglais, WCHAR_T convient au texte multilingue; Le char est largement pris en charge, WCHAR_T dépend de la prise en charge du compilateur et du système d'exploitation Unicode; Le char est limité dans la gamme de caractères, WCHAR_T a une gamme de caractères plus grande et des fonctions spéciales sont utilisées pour les opérations arithmétiques.

Comment utiliser divers symboles dans le langage C Comment utiliser divers symboles dans le langage C Apr 03, 2025 pm 04:48 PM

Les méthodes d'utilisation des symboles dans la couverture du langage C Couverture arithmétique, l'affectation, les conditions, la logique, les opérateurs de bits, etc. Les opérateurs arithmétiques sont utilisés pour les opérations mathématiques de base, les opérateurs d'affectation sont utilisés pour les opérations et les opérations de la soustraction, la multiplication et les opérations de division, les opérations BIT sont utilisé pointeurs nuls, marqueurs de fin de fichier et valeurs non nucères.

La différence entre le multithreading et le C # asynchrone La différence entre le multithreading et le C # asynchrone Apr 03, 2025 pm 02:57 PM

La différence entre le multithreading et l'asynchrone est que le multithreading exécute plusieurs threads en même temps, tandis que les opérations effectuent de manière asynchrone sans bloquer le thread actuel. Le multithreading est utilisé pour les tâches à forte intensité de calcul, tandis que de manière asynchrone est utilisée pour l'interaction utilisateur. L'avantage du multi-threading est d'améliorer les performances informatiques, tandis que l'avantage des asynchrones est de ne pas bloquer les threads d'interface utilisateur. Le choix du multithreading ou asynchrone dépend de la nature de la tâche: les tâches à forte intensité de calcul utilisent le multithreading, les tâches qui interagissent avec les ressources externes et doivent maintenir la réactivité de l'interface utilisateur à utiliser asynchrone.

Comment convertir le charbon dans la langue C Comment convertir le charbon dans la langue C Apr 03, 2025 pm 03:21 PM

Dans le langage C, la conversion de type char peut être directement convertie en un autre type par: Casting: Utilisation de caractères de casting. Conversion de type automatique: Lorsqu'un type de données peut accueillir un autre type de valeur, le compilateur le convertit automatiquement.

Comment utiliser Char Array dans la langue C Comment utiliser Char Array dans la langue C Apr 03, 2025 pm 03:24 PM

Le Array Char stocke des séquences de caractères en C et est déclaré Char Array_name [Taille]. L'élément d'accès est passé par l'opérateur d'indice, et l'élément se termine par le terminateur nul «\ 0», qui représente le point final de la chaîne. Le langage C fournit une variété de fonctions de manipulation de cordes, telles que strlen (), strcpy (), strcat () et strcmp ().

Quelle est la fonction de la somme du langage C? Quelle est la fonction de la somme du langage C? Apr 03, 2025 pm 02:21 PM

Il n'y a pas de fonction de somme intégrée dans le langage C, il doit donc être écrit par vous-même. La somme peut être obtenue en traversant le tableau et en accumulant des éléments: Version de boucle: la somme est calculée à l'aide de la longueur de boucle et du tableau. Version du pointeur: Utilisez des pointeurs pour pointer des éléments de tableau, et un résumé efficace est réalisé grâce à des pointeurs d'auto-incitation. Allouer dynamiquement la version du tableau: allouer dynamiquement les tableaux et gérer la mémoire vous-même, en veillant à ce que la mémoire allouée soit libérée pour empêcher les fuites de mémoire.

See all articles