que c# iis-7.5 httpcontent

c# - owin que es



El mensaje de excepción HTTPError no se muestra cuando webapi se ejecuta en el servidor y se ejecuta localmente (2)

Tengo un webapi que se ejecuta en un servidor IIS7.5. Tiene 3 controladores, y los 3 pueden usarse para acceder al webapi desde las llamadas dentro de mi aplicación.

Tuve un error en el que mi clase base para mi controlador estaba exponiendo sus funciones como públicas, en lugar de protegidas. Esto provocó que el servidor arrojara un Error de servidor interno 500 (debido a una excepción no válida lanzada "Se encontraron varias acciones que coinciden con la solicitud"). Me tomó un tiempo profundizar en esto, porque nunca activó el registro desde mi webapi. A partir de esta discusión here , descubrí que el error que estaba ocurriendo estaba ocurriendo antes de que una función Application_Error lo detectara para registrarlo. Así que agregué el siguiente código a mi global.asax de mi webapi, y ahora puedo registrar errores como este.

PERO, mi problema ahora, cuando causo un Error de Servidor Interno 500 exactamente como arriba, en mi máquina local que ejecuta mi webapi, obtengo un registro exactamente de cómo deseo verlo con el "Mensaje de Excepción" de "Se encontraron múltiples acciones que coinciden la solicitud "enunciada como la razón del error interno del servidor. Pero cuando implemento este código exacto en el servidor y utilizo el webapi desde allí, mi registro solo muestra "Mensaje": "Se produjo un error" y no me muestra el "Mensaje de excepción", aunque puedo ver que la excepción es siendo lanzado utilizando PerfView. Solo necesito poder obtener los registros del servidor para mostrar la misma información que muestra el registro local.

public class ResponseExceptionTrapper : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { return base .SendAsync(request, cancellationToken) .ContinueWith(response => { var result = response.Result; if (!result.IsSuccessStatusCode) { var exceptionResult = string.Format( "Response exception: /r/n Path({0}) /r/n Status({1}) /r/n", request.RequestUri, result.StatusCode); if (result.Content != null) { var exceptionReadTask = result.Content.ReadAsStringAsync(); exceptionReadTask.Wait(); exceptionResult += "Message:" + exceptionReadTask.Result; } // Do something appropriate with exceptionResult exceptionResult.Log(); } return result; }, cancellationToken); } }

Ejemplo de registro del servidor:

Timestamp: 4/24/2014 12:24:40 PM Message: Timestamp: 4/24/2014 4:24:40 PM Message: Response exception: Path(http://webserver/CreditReporting/Api/RetrieveQueuedPullCreditReport) Status(InternalServerError) Message:{"Message":"An error has occurred."}

Ejemplo de registro local:

Timestamp: 4/24/2014 12:03:16 PM Message: Timestamp: 4/24/2014 4:03:16 PM Message: Response exception: Path(http://localhost:XXXXX/Api/RetrieveQueuedPullCreditReport) Status(InternalServerError) Message: {"Message":"An error has occurred.", "ExceptionMessage":"Multiple actions were found that match the request: /r/nSystem.Threading.Tasks.Task`1[ Our.WebServices.CreditReporting.Contracts.RetrieveQueuedPullCreditReportResponse] Post


Descubrí que estos tenían que estar activados en la Configuración Global para el propio webapi:

1: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly; 2: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 3: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;

El servidor realmente determina cuántos detalles mostrar, el valor predeterminado es LocalOnly.

Nuestro método de registro no se considera local, supongo que porque no está realmente integrado en la API en sí, sino porque está en una DLL compartida entre varias API.

Encontré this artículo muy útil.


Utilicé este:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

En Global of API y es exitoso.