Comment puis-je prendre en charge les ETags dans ASP.NET MVC?
Réponses
Trop de publicités?Réponse de @Elijah Glover est une partie de la réponse, mais pas vraiment complète. Celle-ci définira l’ETag, mais vous n’obtenez pas les bénéfices des ETags sans le vérifier sur le serveur. Vous faire avec :
En outre, une autre astuce est que vous devez définir la mise en cache de la réponse, sinon par défaut c’est « privé » et l’ETag ne sera pas être défini dans la réponse :
Si un exemple complet :
L'ETAG MVC sont les mêmes que pour les Formulaires web ou HttpHandlers.
Vous avez besoin d'un moyen de créer de la valeur ETAG, le meilleur moyen que j'ai trouvé est d'utiliser un Fichier MD5 ou ShortGuid.
Depuis .net accepte une chaîne de caractères comme un ETAG, vous pouvez le fixer facilement à l'aide de
String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw"
Response.Cache.SetETag(etag);
Vidéo de MÉLANGE, à la fin, ils utilisent l'ETAG avec le RESTE
Mise à JOUR: j'ai ajouté plein de soutien pour la mise en cache des fichiers (y compris ETag) et les plages d'octet (nécessaire pour la vidéo en iOS) dans mon BizArk projet.
Si vous le souhaitez, vous pouvez utiliser soit le projet (désolé, pas de Nuget pour BizArkWeb encore) ou tout simplement copier le FilePathExResult et toutes les classes de support à votre projet. Le chemin d'accès au fichier de la source de contrôle est /Actuel/BizArkWeb/MVC/ActionResults/FilePathExResult.cs.
Si vous utilisez BizArkWeb, vous pouvez simplement hériter de votre contrôleur de BizArkController et tout est fait pour vous (en supposant que vous suffit d'appeler le Contrôleur.Méthode de fichiers).
public class TestController : BizArkController
{
public ActionResult Puppy()
{
return File(Server.MapPath("/puppy.jpg"));
}
}
Si vous êtes à la recherche d'un algorithme de hachage MD5 ou SHA1 qui peut être utilisé comme un ETag, en voici une:
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(string filePath)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(filePath, sha1);
}
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(Stream s)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(s, sha1);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(string filePath)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(filePath, md5);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(Stream s)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(s, md5);
}
private static string GetHash(string filePath, HashAlgorithm hasher)
{
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
return GetHash(fs, hasher);
}
private static string GetHash(Stream s, HashAlgorithm hasher)
{
var hash = hasher.ComputeHash(s);
var hashStr = Convert.ToBase64String(hash);
return hashStr.TrimEnd('=');
}
Cela n'a pas été testé dans la production de encore. Méfiez-vous des utilisateurs! :)
Le code est basé sur cette article: http://www.codeproject.com/Articles/9560/Get-MD5-and-SHA-1-SHA1-of-any-file