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 ?
Réponses
Trop de publicités?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();
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 :
- 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.
- 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.
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");
}
}
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();
- Réponses précédentes
- Plus de réponses