2016-01-22 9 views
12

ich eine ASP.NET-Anwendung mit einem Filter haben in RegisterGlobalFilters verdrahtet, die Folgendes ausführt:ASP.NET MVC: Programmatische gesetzt HTTP-Header auf statischen Inhalt

public class XFrameOptionsAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.AddHeader("X-FRAME-OPTIONS", "SAMEORIGIN"); 
    } 
} 

Blick in Fiddler, das kann ich sehen Ansichten zurückgegeben von dem Webserver enthalten diesen Header. Statische Dateien wie JavaScript enthalten diesen Header jedoch nicht in der HTTP-Antwort.

Wie bekomme ich ASP.NET MVC, um diesen Filter auch auf alle statischen Dateien anzuwenden, die der Webserver zurückgibt?

+1

Das hat nichts mit Web-API-Filtern zu tun @ DeblatonJean-Philippe – Tommy

Antwort

10

Eine Möglichkeit, Header für den gesamten Inhalt der Website festzulegen, ist web.config. Der Abschnitt customHeaders stellt sicher, dass dieser Header für alle Dateien und Antworten enthalten ist.

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="X-FRAME-OPTIONS" value="SAMEORIGIN" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

Eine weitere Option ist zum Erstellen eigener HttpModule wie unten gezeigt. Auf diese Weise haben Sie mehr Kontrolle über die Dateien und Inhalte, an die Kopfzeilen angehängt werden müssen.

namespace MvcApplication1.Modules 
{ 
    public class CustomOriginHeader : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
     } 

     public void Dispose() { } 

     void OnPreSendRequestHeaders(object sender, EventArgs e) 
     { 
      // For example - To add header only for JS files 
      if (HttpContext.Current.Request.Url.ToString().Contains(".js")) 
      { 
       HttpContext.Current.Response.Headers.Add("X-FRAME-OPTIONS", "SAMEORIGIN"); 
      } 
     } 
    } 
} 

Und registrieren sie dann in web.config wie unten gezeigt -

<system.webServer> 
    <modules> 
     <add name="CustomHeaderModule" type="MvcApplication1.Modules.CustomOriginHeader" /> 
    </modules> 
    </system.webServer> 
+1

Ich habe darüber nachgedacht, aber was passiert, wenn ich ein Szenario habe, wo ich einen bestimmten Header nur * bestimmte * statische Dateien hinzufügen möchte. – codechurn

+1

Ich aktualisierte auch meine Antwort mit dem programmatischen Weg, Header hinzuzufügen, überprüfen Sie es. – ramiramilu

4

Dies ist etwas, das, wenn Sie bei jeder Anfrage wollen (statisch oder dynamisch Anfragen), sollten Sie wahrscheinlich setzen sie durch IIS bis (der Webserver). Hier sind einige Details über verschiedene Möglichkeiten, wie Sie dies erreichen können - http://www.iis.net/configreference/system.webserver/httpprotocol/customheaders

Kurz gesagt, können Sie dies in der Datei web.config tun konnte

<configuration> 
    <system.webServer> 
     <httpProtocol> 
     <customHeaders> 
      <add name="X-Custom-Name" value="MyCustomValue" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

Wenn Sie den Zugriff direkt auf IIS haben, können Sie mit dem UI, um dies auch einzurichten.