109 votes

Existe-t-il des constantes pour les en-têtes HTTP par défaut ?

Microsoft a-t-il créé une classe remplie de constantes pour les noms d'en-têtes HTTP standard ou dois-je écrire les miens ?

5voto

JG in SD Points 2224

Pour compléter la réponse de Jed.

En HttpResponseHeader y HttpRequestHeader peuvent être utilisées comme constantes lors de l'utilisation de la fonction WebHeaderCollection . WebHeaderCollection contient les propriétés de l'indexeur qui acceptent ces énumérations.

Vous pouvez utiliser une chaîne de caractères ou l'une des énumérations pour obtenir et définir la valeur de l'en-tête, et la mélanger dans votre code.

Exemple LinqPad script :

var headers = new WebHeaderCollection();

headers["If-Modified-Since"] = "Sat, 29 Oct 1994 19:43:31 GMT"; 
// shows header name as "If-Modified-Since"
headers.Dump();
// shows expected header value of "Sat, 29 Oct 1994 19:43:31 GMT"
headers[HttpRequestHeader.IfModifiedSince].Dump();

headers.Clear();

headers[HttpRequestHeader.IfModifiedSince] = "Sat, 29 Oct 1994 19:43:31 GMT";
// shows header name as "If-Modified-Since"
headers.Dump(); 
// shows expected header value "Sat, 29 Oct 1994 19:43:31 GMT"
headers["If-Modified-Since"].Dump();

4voto

Palec Points 2881

En Microsoft.Net.Http.Headers.HeaderNames la classe était la meilleure option prête à l'emploi.

Mais depuis ASP.NET Core 3.0, la classe a des champs statiques en lecture seule au lieu de constantes. La raison en est un optimisation des performances des comparaisons :

  1. La comparaison de références est plus rapide que la comparaison ordinale insensible à la casse du contenu d'une chaîne de caractères.
  2. Les constantes font partie de l'ensemble consommé, ce qui n'est pas le cas des champs statiques. Ainsi, les références différaient entre les utilisations de la constante dans les différents assemblages, alors qu'après le changement, elles sont toutes identiques.

L'inconvénient de cette optimisation est que les "constantes" ne sont plus des constantes de compilation et ne sont donc pas utilisables, par exemple, avec des attributs ( [FromHeader(Name = HeaderNames.IfNoneMatch)] ).

Juste créer votre propre copie de la classe dans votre code en utilisant des constantes réelles au lieu de champs statiques.

1voto

Ryan Williams Points 359
using System.Net.HttpRequestHeader;
using System.Net.HttpResponseHeader;

public class Example {
  static void Main() {
    Console.WriteLine(HttpRequestHeader.IfModifiedSince.ToHeaderString());
    // If-Modified-Since

    Console.WriteLine(HttpResponseHeader.ContentLength.ToHeaderString());
    // Content-Length
  }
}

static class ExtensionMethods {
  public static string ToHeaderString(this HttpRequestHeader instance)
  {
    return Regex.Replace(instance.ToString(), "(\\B[A-Z])", "-$1");
  }

  public static string ToHeaderString(this HttpResponseHeader instance)
  {
    return Regex.Replace(instance.ToString(), "(\\B[A-Z])", "-$1");
  }
}

0voto

Leonard Lewis Points 1

Si vous utilisez .NET Framework (et non .NET Core), vous pouvez créer une méthode d'extension pour formater correctement le fichier System.Net.HttpRequestHeader enum :

using System;
using System.Net;
using System.Text;

namespace YourNamespace
{
   public static class HttpRequestHeaderEx
   {
      public static string ToStandardName(this HttpRequestHeader requestHeader)
      {
         string headerName = requestHeader.ToString();

         var headerStandardNameBuilder = new StringBuilder();
         headerStandardNameBuilder.Append(headerName[0]);

         for (int index = 1; index < headerName.Length; index++)
         {
            char character = headerName[index];
            if (char.IsUpper(character))
            {
               headerStandardNameBuilder.Append('-');
            }

            headerStandardNameBuilder.Append(character);
         }

         string headerStandardName = headerStandardNameBuilder.ToString();

         return headerStandardName;
      }
   }
}

Utilisation :

   var userAgentHeaderName = HttpRequestHeader.UserAgent.ToStandardName();

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