Web Api on Azure shows no error detail using 'return InternalServerError(ex)'

本小妞迷上赌 提交于 2019-12-05 16:58:56

问题


My Web Api when run locally (in Release mode) will return any errors in this format:

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "No text specified",
    "ExceptionType": "System.Exception",
    "StackTrace": null
}

But after deployment/publish to an Azure VM, only this remains:

{
    "Message": "An error has occurred."
}

API code:

try
{
    var msg = ...
    new MessageService().SaveMessage(msg)); // <-- does some checks; may throw.
    return Ok();
}
catch (Exception ex)
{
    return InternalServerError(ex);
}

I'd like it to be more detailed on Azure, like the local result.
Can this be achieved, and if so, how?

I already (temporarily) removed <compilation xdt:Transform="RemoveAttributes(debug)" /> from the <system.web> part of Web.Release.config, and then re-deployed, but that made no difference.

Or am I using the wrong approach/pattern?
Obviously technical details should be limited, but right now we get no details at all.


回答1:


You could try adding the following to your Global.asax:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

Note: I wouldn't recommend that you keep this setting on in a production environment.




回答2:


If instead you use

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Default; 

then you can use the system.webServer error switch e.g.

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

Note the existingResponse attribute to preserve the error message.




回答3:


I had the same problem, the post is three years old, things have changed a little. If you setup a new Azure Mobile App with Visual Studio 2017 there is no longer a Global.asax.cs. I searched for hours, where to put this IncludeErrorDetailPolicy. It won't work without that setting.

You do it in your Startup.MobileApp.cs:

  public partial class Startup
  {
        public static void ConfigureMobileApp(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

            new MobileAppConfiguration()
                .UseDefaultConfiguration()
                .ApplyTo(config);

Don't forget, in your Web.config you also need to set:

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

Don't use that for production environment!




回答4:


For Web API 2, you can implement a custom IExceptionLogger that utilizes Azure Application Insights. Something like this:

using Microsoft.ApplicationInsights;
using System.Web.Http.ExceptionHandling;

namespace Your.Namespace.Here
{
    public class TelemetryExceptionLogger : ExceptionLogger
    {
        private readonly TelemetryClient telemetryClient;

        public TelemetryExceptionLogger(TelemetryClient telemetryClient)
        {
            this.telemetryClient = telemetryClient;
        }

        public override void Log(ExceptionLoggerContext context)
        {
            if (context != null && context.Exception != null)
            {
                telemetryClient.TrackException(context.Exception);
            }

            base.Log(context);
        }
    }
}

Then you need to register it with Web API:

using Microsoft.ApplicationInsights;
using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using Your.Namespace.Here;

namespace Some.Other.Namespace.Or.The.Same
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // --- Normal Web API configuration here ---

            config.Services.Add(typeof(IExceptionLogger), new TelemetryExceptionLogger(new TelemetryClient())); 
        }
    }
}

For this to work, you will need to have set up Application Insight in Azure and for your VS project, but that is a story for another time :) For more information, see Application Insights: Exception Telemetry




回答5:


I have a scenario with the same error, and the problem was a copy&paste in the route header attribute of a method. I have the same route for two methods

    [Route("test/Method1")]
    public IHttpActionResult Method1(){...}

    [Route("test/Method1")]
    public IHttpActionResult Method2(){...}

Check the new methods and Routes added.



来源:https://stackoverflow.com/questions/25430077/web-api-on-azure-shows-no-error-detail-using-return-internalservererrorex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!