Suppression des en-têtes de la réponse

je dois masquer certains en-têtes générés par ASP.NET et IIS et est retourné dans les réponses d'un ASP.NET service WebAPI. Les en-têtes que je dois masquer sont:

  • Serveur
  • X-AspNet-Version
  • X-AspNetMvc-Version
  • X-Powered-By

le service était auparavant hébergé dans WCF, et l'occultation a été faite dans un HttpModule en s'abonnant à Presend requeresttheaders et la manipulation de HttpContext.Actuel.Réponse.Tête. Avec ASP.NET WebAPI tout est maintenant basé sur les tâches, donc HttpContext.Le courant est nul. J'ai essayé d'insérer un gestionnaire de messages et de manipuler le message HttpResponseMessage retourné, mais les en-têtes n'étaient pas présents sur cette scène. X-Powered-By peut être supprimé dans les paramètres IIS, mais quelle est la façon suggérée de supprimer le reste d'entre eux?

13
demandé sur Hendrik W. Hansen 2012-06-22 15:18:06

3 réponses

le problème est que chacun est ajouté à un point différent:

  • Server : ajouté par IIS. Pas exactement sûr si elle peut être désactivée bien que vous semblez avoir été de l'enlever en utilisant HttpModule .
  • X-AspNet-Version : ajouté par système.Web.dll au moment de la chasse d'eau dans HttpResponse classe
  • X-AspNetMvc-Version : ajouté par MvcHandler dans le système.Web.DLL. Elle peut être remplacée, ce devrait être OK.
  • X-Powered-By par IIS mais peut être désactivée comme vous l'avez dit.

je pense que votre meilleure option est toujours D'utiliser HttpModules.

11
répondu Aliostad 2012-06-22 12:16:34

pour le bénéfice de ceux qui atterrissent ici par une recherche google / bing:: Voici le résumé des étapes:

Etape 1: créer une classe qui dérive de IHttpModule (et IDisposable pour nettoyer quand nous avons terminé):

    public class MyCustomModule : IHttpModule, IDisposable
    {
         private HttpApplication _httpApplication
private static readonly List<string> HeadersToCloak = new List<string>
            {
                "Server",
                "X-AspNet-Version",
                "X-AspNetMvc-Version",
                "X-Powered-By"
            };
    ..
    }

Étape 2: Obtenir une référence à la valeur intrinsèque du contexte dans le IHttpModule.Méthode Init, et assignez un gestionnaire d'événements à L'événement PreSendRequestHeaders:

public void Init(HttpApplication context)
        {
            _httpApplication = context;

            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

Étape 3: maintenant les en-têtes peuvent être enlevés comme suit:

private void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            if (null == _httpApplication)
            {
                return;
            }

            if (_httpApplication.Context != null)
            {
                var response = _httpApplication.Response;
                HeadersToCloak.ForEach(header => response.Headers.Remove(header));
            }
        }

Étape 4: enregistrez maintenant ce module dans votre réseau racine.la config dans le système.serveur (si exécute IIS 7.0 en mode intégré plus de détails ici):

<configuration>
  <system.webServer>
    <modules>
      <add name="MyCustomModule" type="<namespace>.MyCustomModule "/>
    </modules>
  </system.webServer>
</configuration>

Espérons que cette aide!

10
répondu dotnetguy 2013-08-26 08:59:37

si vous utilisez IIS7 / Azure alors regardez ceci:

Supprimer/Cacher/désactiver les en-têtes de réponse HTTP excessifs en Azure/IIS7 sans UrlScan

il montre la meilleure façon de désactiver ces en-têtes sans utiliser HttpModules.

1
répondu Nick Evans 2017-05-23 12:09:29