net mvc deploy asp iis-7 asp.net-mvc-4 asp.net-web-api

iis 7 - mvc - El "mensaje" de WebApi("se ha producido un error") en IIS7, no en IIS Express



publish website in iis 7 (6)

Básicamente:

Use IncludeErrorDetailPolicy en su lugar si CustomErrors no lo resuelve (por ejemplo, si su stack de ASP.NET es> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

Nota: Tenga cuidado al devolver la información detallada del error para revelar información confidencial a los ''hackers''. Vea el comentario de Simon sobre esta respuesta a continuación.

TL; versión DR

Para mí CustomErrors realmente no me ayudó. Ya estaba configurado en Off , pero todavía recibí un miserable mensaje de an error has occurred . Supongo que la respuesta aceptada es de hace 3 años, que es mucho tiempo en la palabra web hoy en día. Estoy usando Web API 2 y ASP.NET 5 (MVC 5) y Microsoft se ha alejado de una estrategia IIS-only, mientras que CustomErrors es old skool IIS;).

De todos modos, tuve un problema en la producción que no tenía localmente. Y luego descubrí que no podía ver los errores en la pestaña Red de Chrome como pude en mi máquina de desarrollo. Al final, logré resolverlo instalando Chrome en mi servidor de producción y luego navegando hacia la aplicación allí en el servidor mismo (por ejemplo, en ''localhost''). Luego aparecieron errores más detallados con rastros de pila y todo.

Solo después encontré este artículo de Jimmy Bogard (Nota: ¡Jimmy es el Sr. AutoMapper! ). Lo curioso es que su artículo es también de 2012, pero en él ya explica que CustomErrors ya no ayuda con esto, pero que PUEDE cambiar el ''Detalle de error'' configurando una IncludeErrorDetailPolicy diferente en la configuración global de WebApi (por ej. WebApiConfig.cs ):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

Afortunadamente, también explica cómo configurarlo para que webapi (2) CustomErrors escuche la configuración de CustomErrors . Ese es un enfoque bastante sensato, y esto te permite volver al 2012: P.

Nota: El valor predeterminado es ''LocalOnly'', lo que explica por qué pude resolver el problema de la manera que describí antes de encontrar esta publicación. Pero entiendo que no todo el mundo puede simplemente controlar remotamente la producción y poner en marcha un navegador (sé que en su mayoría no podría hasta que decidí ir a un programa independiente AND DevOps).

Estoy trabajando con ASP.NET MVC 4 WebApi y estoy divirtiéndome mucho al ejecutarlo en mi computadora local en IIS Express. También configuré IIS Express para que funcione en máquinas remotas, por lo que otras personas de mi empresa utilizan mi computadora como servidor web.

Después de decidir que esta era una solución menos que óptima, decidimos poner WebApi en un servidor remoto después de instalar .NET 4.5. Cuando uso fiddler y envío un POST a un controlador en mi máquina local, devuelve la respuesta correcta, pero cuando cambio el dominio al servidor web que ejecuta IIS7, el mismo POST devuelve un críptico

{"mensaje": "ha ocurrido un error"}

mensaje. ¿Alguien tiene alguna idea de lo que podría estar pasando?


El problema era una dependencia faltante que no estaba en el servidor pero que estaba en mi máquina local. En nuestro caso, era un dll Devart.Data.Linq.

Para llegar a esa respuesta, activé el rastreo de IIS para detectar 500 errores. Eso dio un poco de información, pero la cosa realmente útil fue en la configuración web.config configurando <system.web><customErrors mode="Off"/></system.web> Esto apuntaba a una dependencia faltante cargada dinámicamente . Después de agregar esta dependencia y decirle que se copie localmente, el servidor comenzó a funcionar.


En caso de que esto ayude a alguien:

Tuve un problema similar, y siguiendo las instrucciones de Nates, agregué:

<system.web> <customErrors mode="Off"/> </system.web>

esto me mostró más información sobre el error:

"ExceptionMessage": "No se puede cargar el recurso de metadatos especificado.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "en System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources (...

Esto fue cuando recordé que había movido el archivo edmx a una ubicación diferente y había olvidado cambiar el nodo connectionstrings en la configuración (el nodo connectionsstrings se colocó en un archivo separado usando "configSource", pero esa es otra historia).


Ninguna de las otras respuestas funcionó para mí.

Esto hizo: (en Startup.cs)

public class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); WebApiConfig.Register(config); // Here: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; } }

(o puede colocarlo en WebApiConfig.cs):

public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); // Here: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; } }


Siempre llego a esta pregunta cuando encuentro un error en el entorno de prueba y recuerdo: "He hecho esto antes, pero puedo hacerlo directamente en el web.config sin tener que modificar el código y volver a implementarlo en el entorno de prueba. , pero toma 2 cambios ... ¿qué fue de nuevo? "

Para futura referencia

<system.web> <customErrors mode="Off"></customErrors> </system.web>

Y

<system.webServer> <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors> </system.webServer>


Tuve un problema similar al publicar en el punto final de WebAPI. Al activar CustomErrors = Off, pude ver el error real que era uno de los dlls que faltaba.