2016-04-07 12 views
3

ich hinzugefügt haben und eine Reihe von Headern aus Sicherheitsgründen entfernt, zwei klassische Strategien in einer MVC-Anwendung mit:Prüfung für HTTP-Header wird von einer ASP.NET MVC-Anwendung zurückgegeben

protected void Application_PreSendRequestHeaders(object sender, EventArgs e) 
{ 
    HttpContext.Current.Response.Headers.Remove("X-AspNet-Version"); 
    HttpContext.Current.Response.Headers.Remove("Server"); 
    HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version"); 
} 

und über das Web .Config:

<customHeaders> 
    <remove name="X-Powered-By" /> 
    <add name="X-Frame-Options" value="DENY" /> 
</customHeaders> 

Im Moment bin ich mit NUnit gepaart mit RhinoMocks für die Prüfung, FWIW.

Angesichts der Schwierigkeiten mit Mocking HttpContext, was wäre ein guter Weg, um sicherzustellen, dass benutzerdefinierte Header sind vorhanden oder nicht in der HTTP-Antwort für eine der Ansichten, die ich zurückgeben?

+0

Können Sie einen der Tests zeigen, die Sie bisher versucht haben, damit Ihr Problem repliziert werden kann und sie vielleicht jemand eine mögliche Lösung zur Verfügung stellen kann. – Nkosi

Antwort

4

Der richtige Weg, um dieses Verhalten zu überprüfen, ist durch einen Komponententest. Der Grund ist ziemlich einfach; Sie versuchen, ein Sicherheitsproblem zu vermeiden. In UT wird nichts dafür sorgen, dass Ihre Komponente dieses Verhalten verwendet. Ich kann Ihnen verschiedene Optionen anbieten (Code-Weben-Tools, öffentliche Methode hinzufügen usw.), um es als UT zu testen, aber IMO ist dies ein klassischer Fall für Integrationstest.

Um Komponententest dieses Verhalten die folgenden Schritte aus:

Heben Sie einen Selbst Host-Server (Self-Host ASP.NET oder OWIN to Self-Host ASP.NET)

Dann Anruf ein Verfahren und behaupten, dass die Antwort enthält nicht die Header:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 

Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-Frame-Options"); 
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("Server"); 
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNetMvc-Version"); 
//todo: add logic which read the following parameters from the configuration 
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNet-Version"); 
Assert.AreEquals("DENY", myHttpWebResponse.Headers["X-Frame-Options"]); 
+0

Als Ergänzung zu dieser Frage und Fox Antwort. Es ist möglich, eigene Abstraktionen für die versiegelten Microsoft-Klassen zu erstellen und dann zu testen und zu testen. Sie können auch eines von mehreren Abstraktionsprojekten herunterladen, darunter eines von Microsoft. Beziehen Sie sich auch auf diese Frage für weitere gute Informationen, insbesondere zu dem, warum wir diese Probleme mit HttpContext haben: http://stackoverflow.com/questions/1947471/unable-to-examine-reponse-headers-in-unit-test – Ray