Quindi, ho un attributo personalizzato chiamato CompressAttribute che è impostato come un filtro globale in global.asax. Usa la riflessione per esaminare il tipo di ritorno del metodo di azione corrente e se è "ViewResult" comprime l'output usando GZip o Deflate. Funziona bene, tranne se una pagina genera un errore di 500 server. Se viene rilevato un errore, invece di visualizzare la pagina di errore .NET, ottengo un sacco di questo:Filtro di compressione MVC 3 che causa un'errata produzione
`I%% &/m {J J t
Apparentemente sta tentando di codificare la pagina Errore del server 500 che causa problemi. Qual è il modo migliore per gestire questo?
Ecco il codice del filtro:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
MethodInfo actionMethodInfo = Common.GetActionMethodInfo(filterContext);
if (GetReturnType(actionMethodInfo).ToLower() != "viewresult") return;
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new WebCompressionStream(response.Filter, CompressionType.GZip);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new WebCompressionStream(response.Filter, CompressionType.Deflate);
}
}
Si potrebbe provare a creare una pagina di errore personalizzata? –
Questo non risolve il problema. Devo essere in grado di vedere le informazioni sulle eccezioni, lo stack delle informazioni di tracciamento, ecc. Durante il debug. – Scott
Ciò non significa che non puoi farlo usando l'attributo 'HandleError'. –