J'ai découvert les profils ASP.NET il y a quelques années et j'ai trouvé qu'il était facile et rapide d'implémenter de puissantes fonctionnalités dans mon site web. J'ai fini par utiliser exclusivement des propriétés de profil "anonymes" car je n'utilise PAS d'abonnement ASP.NET et je voulais suivre les informations et fournir une personnalisation pour les utilisateurs de mon site même s'ils n'étaient pas connectés. J'ai du mal à garder la taille de ma base de données aspnetdb dans la limite de 3 Go de mon fournisseur d'hébergement. J'ai décidé il y a un an que je ne conserverais que 6 mois de données de profil et que tous les mois je dois maintenant lancer la procédure aspnet_Profile_DeleteInactiveProfiles suivie d'une demande de support à mon hôte pour tronquer le fichier de base de données. Le vrai inconvénient est maintenant que j'ai cette fonctionnalité mise en œuvre, le site Web s'appuie sur cette base de données et il y a des temps d'arrêt chaque fois que j'ai besoin de tronquer. Aujourd'hui, le site a été bloqué pendant plus de 12 heures en faisant de la maintenance sur aspnetdb et j'ai fini par créer une copie de reprise de la base de données aspnetdb juste pour pouvoir mettre le site en ligne (la base de données aspnetdb comme j'écris ceci).Existe-t-il des alternatives plus efficaces aux profils anonymes ASP.NET 2.0?
L'année dernière, j'ai réécrit certaines des fonctionnalités car il stockait une petite collection d'objets binaires et je l'ai converti pour stocker une chaîne délimitée par des virgules d'ID, ce qui le rend plus petit pour le stockage. J'ai cherché à obtenir plus d'espace disque, mais la réalité est qu'il ne vaut pas la peine d'avoir une base de données qui se développe de 4 Go chaque année juste pour faire des choses simples comme garder une liste des derniers utilisateurs consultés les produits, gardez une trace de la catégorie dans laquelle ils se trouvaient pour un bouton «continuer à magasiner» pour les reprendre, et stockez le montant total (monnaie seulement) qui se trouve dans leur panier. De manière réaliste, moins de 5% des données sont réutilisées par les visiteurs réguliers du site, mais il est impossible de savoir à l'avance lequel de ces utilisateurs reviendra pour accéder aux informations de son profil. Donc, ma question est de savoir s'il existe un moyen plus efficace de stocker les données de profil pour ne pas prendre trop de place ou s'il existe des alternatives à la création d'enregistrements de base de données de profil pour chaque utilisateur pour supporter cette fonctionnalité?
J'ai jeté un coup d'oeil au table profile provider, mais quelqu'un peut-il vérifier si son utilisation permettra de stocker les données en utilisant moins d'espace disque que le fournisseur par défaut?
Mise à jour:
Je l'ai fait quelques recherches et il semble que le champ nvarchar (max) est un remplacement direct pour les champs ntext qui sont utilisés par l'implémentation par défaut du aspnetdb, mais ne nécessite que la moitié de l'espace disque selon this article et this one. Cela signifie que je devrais être capable de créer une nouvelle copie de aspnetdb, de modifier le type de données dans son schéma et son code, et de transférer les données dans la nouvelle base de données. Cela devrait corriger à la fois la façon dont les données sont stockées et toute fragmentation qui s'est produite lors de l'opération de réduction.
J'ai maintenant terminé les tests et déplacé cette solution en production. Au début, je pensais qu'il y aurait un problème car Microsoft a codé en dur le type de données NText dans l'appel de procédure stockée à l'intérieur du SqlProfileProvider. Cependant, il s'avère que SQL Server convertira implicitement un paramètre NText en nvarchar (MAX). En bref, je n'avais rien d'autre à changer que les types des colonnes PropertyNames et PropertyValuesString de la table aspnet_Profiles.
Les données ont dû être réécrites sur le disque pour libérer de l'espace, mais j'ai fini par économiser environ 30% en changeant simplement le type de données.
Une autre mise à jour:
J'ai aussi découvert que bien que je reçois environ 700 visiteurs uniques chaque jour, le nombre moyen de quotidiens « utilisateurs » dans les moyennes de table aspnet_Users sur 4000-5000. J'ai théorisé que cela était dû au fait que certains utilisateurs naviguent sans cookies. J'ai effectué quelques tests et découvert qu'un utilisateur ne sera pas créé si le profil n'est pas mis à jour, mais si vous écrivez dans le profil, un utilisateur (et un profil) sera créé à chaque requête si les cookies ne sont pas activés.
Je travaille sur une solution de contournement pour cela. J'essaye d'écrire le javascript pour un appel d'AJAX à un webmethod. En théorie, la deuxième requête (l'appel AJAX) devrait avoir le cookie .ASPXANONYMOUS présent si les cookies sont activés, et donc je peux écrire en toute sécurité dans le profil. Le javascript ne sera injecté dans la page que s'il s'agit du début de la session (déterminé par la propriété Session.IsNewSession). L'utilisateur ne devrait jamais être au courant de l'appel AJAX - il est seulement là pour dire à la page si les cookies sont activés afin qu'il puisse mettre à jour le profil.
Bien sûr, chaque demande subséquente peut simplement vérifier la collection de cookies pour s'assurer que le cookie .ASPXANONYMOUS est présent. Très probablement, je vais créer une fonction partagée qui peut être appelée à la fois par un AJAX appelé webmethod et par l'événement Page_Load directement, et utiliser la propriété IsNewSession pour déterminer quelle requête autoriser pour exécuter la vérification de cookie et la mise à jour de profil suivante. Selon Microsoft, l'utilisation de la session pour savoir si les cookies sont activés va à l'encontre du but (car la session dépend des cookies). Ils suggèrent de conserver votre valeur AreCookiesEnabled dans une base de données, mais ils ne mentionnent pas comment vous devez garder la trace de la valeur - si les cookies ne sont pas activés, comment pouvez-vous lier une requête à un enregistrement de base de données?