studio - Los errores personalizados reescritos de ASP.NET no envían encabezado de tipo de contenido
visual studio debug iis (3)
Tengo la siguiente configuración en mi web.config:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.html">
<error statusCode="404" redirect="~/Error/Error.html" />
<error statusCode="400" redirect="~/Error/Error.html" />
</customErrors>
FWIW, esta es una aplicación ASP.NET MVC 3.
Cuando genero un error. Por ejemplo visitando ..
http://testserver/this&is&an&illegal&request
.. que está bloqueado por la validación de solicitud ASP.NET, se devuelve la página de error, pero no hay encabezado de tipo de contenido. IE infiere el contenido y presenta el HTML, sin embargo, Firefix (correctamente IMO) trata el contenido como texto y muestra el código HTML.
¿Hay pasos adicionales que debo seguir para persuadir a ASP.NET de que envíe un encabezado de tipo de contenido? Supongo que esto está relacionado con el hecho de que está recogiendo los archivos del sistema de archivos, pero los tipos MIME parecen estar configurados correctamente en el servidor.
ASP.Net no enviará este IIS lo hará. Si desea que ASP.Net lo envíe, intente agregar un Error.aspx y vea qué aspecto tiene.
Lo que quiero decir aquí es que se le enviará a una página html, que, a menos que haya conectado IIS para ejecutarlas a través de aspnet, solo se servirá normalmente.
Si agrega una nueva página error.aspx, puede a) verificar si ASP.Net ha solucionado su problema o b) agregar manualmente sus encabezados allí.
Con una página de error de archivo estático, no he encontrado ninguna solución.
Usando una página de error dinámico, los encabezados están configurados correctamente. Pero puede perder el código de estado de error en el proceso y luego debe configurarlo usted mismo en el código de la página de error. (Esa es de alguna manera la respuesta de rangitatanz, pero tal vez esté escrita de manera más explícita).
Así que aquí hay una solución de ejemplo que uso (forma de formulario web):
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/unknown.aspx">
<error statusCode="404" redirect="~/Error/404.aspx" />
<error statusCode="400" redirect="~/Error/400.aspx" />
</customErrors>
Y en carga de página (aquí para el 404):
protected void Page_Load(object sender, EventArgs e)
{
Response.StatusCode = 404;
Response.StatusDescription = "Not found";
Response.TrySkipIisCustomErrors = true;
}
Esto podría ser usado en un proyecto MVC. Si no desea mezclar formularios web y MVC, puede escribir un controlador de error para eso con sus vistas asociadas. (De hecho, esa es la forma en que entro en mi proyecto MVC, pero actualmente estoy de vuelta en un formulario web y por eso lo he resuelto usando el formulario web.)
Mi aplicación ASP.NET MVC 2 estaba enviando el encabezado de tipo de contenido - Content-Type: text / html - correctamente. Luego comenzó a dar este problema extraño después de actualizar el grupo de aplicaciones de .Net Framework v2 a .Net Framework v4. Estoy usando la siguiente configuración
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/500.html">
<error statusCode="404" redirect="/404.html" />
</customErrors>
y quería seguir las páginas estáticas para mis páginas de error personalizadas.
La única solución que se me ocurrió fue establecer el encabezado explícitamente en el método Application_Error de la clase MvcApplication en el archivo Global.asax.cs.
public class MvcApplication : System.Web.HttpApplication
{
// .
// .
// .
void Application_Error(object sender, EventArgs e)
{
// .
// Remember to set Response.StatusCode and
// Response.TrySkipIisCustomErrors
// .
Response.ContentType = "text/html";
// .
// .
// .
}
// .
// .
// .
}
Un poco molesto pero la solución más simple que me vino a la mente.