96 lines
3.5 KiB
C#
96 lines
3.5 KiB
C#
using Owin;
|
|
using System.Web.Http.ExceptionHandling;
|
|
using System.Web.Http;
|
|
using Microsoft.Owin;
|
|
using System.Net.Http;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
using System;
|
|
|
|
[assembly: OwinStartup(typeof(CompControl.SapFrameworkConnector.Startup))]
|
|
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
|
|
|
|
namespace CompControl.SapFrameworkConnector
|
|
{
|
|
public class Startup
|
|
{
|
|
public void Configuration(IAppBuilder app)
|
|
{
|
|
HttpConfiguration config = new HttpConfiguration();
|
|
config.Services.Replace(typeof(IExceptionLogger), new UnhandledExceptionLogger());
|
|
config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
|
|
config.MapHttpAttributeRoutes();
|
|
config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
|
|
app.UseWebApi(config);
|
|
}
|
|
}
|
|
|
|
class UnhandledExceptionLogger : ExceptionLogger
|
|
{
|
|
private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
public override void Log(ExceptionLoggerContext context) { _log.Error("Web API - Unhandled Exception", context.Exception); }
|
|
}
|
|
|
|
class GlobalExceptionHandler : ExceptionHandler
|
|
{
|
|
public override void Handle(ExceptionHandlerContext context)
|
|
{
|
|
if (context.Exception is ArgumentNullException)
|
|
{
|
|
var result = new HttpResponseMessage(HttpStatusCode.BadRequest)
|
|
{
|
|
Content = new StringContent(context.Exception.Message),
|
|
ReasonPhrase = "ArgumentNullException"
|
|
};
|
|
|
|
context.Result = new ArgumentNullResult(context.Request, result);
|
|
}
|
|
else
|
|
{
|
|
// Handle other exceptions
|
|
context.Result = new TextPlainErrorResult
|
|
{
|
|
Request = context.ExceptionContext.Request,
|
|
Content = context.Exception.Message,
|
|
ReasonPhrase = "Unhandled Web API Exception"
|
|
};
|
|
}
|
|
}
|
|
|
|
private class TextPlainErrorResult : IHttpActionResult
|
|
{
|
|
public HttpRequestMessage Request { get; set; }
|
|
public string Content { get; set; }
|
|
public string ReasonPhrase { get; set; }
|
|
|
|
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
|
|
{
|
|
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
|
|
response.Content = new StringContent(Content);
|
|
response.RequestMessage = Request;
|
|
response.ReasonPhrase = ReasonPhrase;
|
|
return Task.FromResult(response);
|
|
}
|
|
}
|
|
|
|
private class ArgumentNullResult : IHttpActionResult
|
|
{
|
|
private HttpRequestMessage _request;
|
|
private HttpResponseMessage _httpResponseMessage;
|
|
|
|
|
|
public ArgumentNullResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage)
|
|
{
|
|
_request = request;
|
|
_httpResponseMessage = httpResponseMessage;
|
|
}
|
|
|
|
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
|
|
{
|
|
return Task.FromResult(_httpResponseMessage);
|
|
}
|
|
}
|
|
}
|
|
}
|