using Microsoft.Owin.FileSystems; using Microsoft.Owin.Hosting; using Microsoft.Owin.StaticFiles; using Owin; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.Routing; using ZeroLevel; namespace Semantic.API { public class LogRequestAndResponseHandler : DelegatingHandler { protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // log request body string requestBody = await request.Content.ReadAsStringAsync(); Log.Debug(requestBody); // let other handlers process the request var result = await base.SendAsync(request, cancellationToken); if (result.Content != null) { //(result.Content as ObjectContent).Formatter.MediaTypeMappings.Clear(); // once response body is ready, log it var responseBody = await result.Content.ReadAsStringAsync(); Log.Debug(responseBody); } return result; } } public class EnableInheritRoutingDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { // inherit route attributes decorated on base class controller's actions return actionDescriptor.GetCustomAttributes(inherit: true); } } public class Startup { // This code configures Web API. The Startup class is specified as a type // parameter in the WebApp.Start method. public void Configuration(IAppBuilder appBuilder) { // Configure Web API for self-host. HttpConfiguration config = new HttpConfiguration(); config.MapHttpAttributeRoutes(new EnableInheritRoutingDirectRouteProvider()); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); config.EnsureInitialized(); if (_log_request_response) { config.MessageHandlers.Add(new LogRequestAndResponseHandler()); } if (ZeroLevel.Configuration.Default.FirstOrDefault("ntlmEnabled", false)) { // Enable NTLM authentication ((HttpListener)appBuilder.Properties["System.Net.HttpListener"]).AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication; } appBuilder.UseWebApi(config); if (_enable_static_files) { var webdir = Path.Combine(ZeroLevel.Configuration.BaseDirectory, "web"); if (false == Directory.Exists(webdir)) { Directory.CreateDirectory(webdir); } PhysicalFileSystem fileSystem = new PhysicalFileSystem(webdir); FileServerOptions options = new FileServerOptions { EnableDefaultFiles = true, FileSystem = fileSystem }; options.StaticFileOptions.ServeUnknownFileTypes = true; appBuilder.UseFileServer(options); } } private static bool _log_request_response; private static bool _enable_static_files; public static void Run( bool log_request_response, bool enable_static_files = false) { _log_request_response = log_request_response; _enable_static_files = enable_static_files; string baseAddress = string.Format("http://*:{0}/", ZeroLevel.Configuration.Default.First("webApiPort")); WebApp.Start(url: baseAddress); Log.Info(string.Format("Web service url: {0}", baseAddress)); } } }