65 votes

Comment dois-je l’appui ETags dans ASP.NET MVC ?

Comment puis-je prendre en charge les ETags dans ASP.NET MVC?

46voto

jaminto Points 1178

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 :

30voto

Elijah Glover Points 1728

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

1voto

Brian Points 13596

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X