the tag resource net mvc found cannot asp asp.net-mvc iis asp.net-web-api error-handling web-config

asp.net mvc - tag - ¿Es posible usar páginas de error personalizadas con el sitio MVC pero no con la API web?



tag helpers asp net core (3)

Bueno, después de casi un año de dejar margar esta pregunta, le di otra oportunidad. Aquí está la magia web.config que me dio lo que quería:

<!-- inside of <configuration> to allow error responses from requests to /api through --> <location path="api"> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough" > <clear/> </httpErrors> </system.webServer> </location> <!-- original httpErrors, inside of <location path="." inheritInChildApplications="false"> to serve custom error pages when the MVC site returns an error code --> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="400" subStatusCode="-1" /> <remove statusCode="404" subStatusCode="-1" /> <remove statusCode="500" subStatusCode="-1" /> <remove statusCode="403" subStatusCode="-1" /> <error statusCode="400" prefixLanguageFilePath="" path="Content/notfound.htm" responseMode="File"/> <error prefixLanguageFilePath="" statusCode="404" path="Content/notfound.htm" responseMode="File" /> <error statusCode="500" path="/errors" responseMode="ExecuteURL" /> <error statusCode="403" path="/errors/http403" responseMode="ExecuteURL" /> </httpErrors>

El quid de lo que está sucediendo aquí es que el nodo <location> permite anular las configuraciones realizadas en una ruta menos específica. Entonces, si tenemos errorMode = "Custom" para path = ".", Anulamos eso para la ruta de acceso de nuestra API web con el nodo <location path="api"> , y la configuración de httpErrors dentro de ella.

Había visto nodos antes, pero no me di cuenta de que este era su propósito hasta ahora. Este artículo entra en más detalles sobre el modelo de herencia de configuración de IIS / .NET, que encontré muy informativo: http://weblogs.asp.net/jongalloway/10-things-asp-net-developers-should-know-about-web-config-inheritance-and-overrides

Tengo un proyecto de MVC con una carpeta / api que contiene mis controladores de API web. Quiero las siguientes cosas:

  • Mi sitio MVC para servir una página de error personalizada cuando se produce un error
  • Mi API web para servir la respuesta de error predeterminada (json / xml que contiene la excepción y el seguimiento de la pila)

En el sitio web.config para mi sitio MVC, tengo un nodo httpErrors, y he configurado el modo de error en "Personalizado" para que pueda tener agradables páginas de error cuando 404s / 500s / etc. ocurrir durante la navegación del sitio MVC:

<httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <remove statusCode="500" subStatusCode="-1" /> <remove statusCode="403" subStatusCode="-1" /> <error prefixLanguageFilePath="" statusCode="404" path="Content/notfound.htm" responseMode="File" /> <error statusCode="500" path="/Errors" responseMode="ExecuteURL" /> <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" /></httpErrors>

Sin embargo, con esa configuración, la API publicará la página de error personalizada cuando se produzca un error, no json / xml con el rastreo de excepción / pila (que es el comportamiento deseado).

¿Hay alguna manera de configurar los errores personalizados para que solo se apliquen a mi sitio MVC y no a la API web? Este blog dice que no existe ( http://blog.kristandyson.com/2012/11/iis-httperrors-aspnet-web-api-fully.html ), pero me gustaría saber si alguien más ha encontrado un trabajo. desde que ese blog fue publicado.

Supongo que si no pudiera crear un proyecto / ensamblaje separado para mi proyecto de API web. Eso me permitiría configurar httpErrors para MVC y Web API por separado, pero preferiría no crear otro proyecto solo para tener otro web.config para configurar.


Lo que funcionó para mí:

<httpErrors existingResponse="Auto" defaultResponseMode="Redirect" errorMode="Custom"> <remove statusCode="403" subStatusCode="-1" /> <error statusCode="403" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" /> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" /> <remove statusCode="500" subStatusCode="-1" /> <error statusCode="500" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" /> </httpErrors>

Parece que simplemente establecer existingResponse = "Auto" hará el trabajo.


No he probado esto, pero ¿qué le parece escribir el código para manejar sus errores de aplicación MVC, como se muestra aquí http://thirteendaysaweek.com/2012/09/25/custom-error-page-with-asp-net-mvc-4 /?

Su código muestra que está haciendo esto en el nivel de aplicación (Global.asax), pero creo que también podría atrapar excepciones en un nivel inferior de la misma manera, con un método para MVC y otro para API web.