using Common.Helpers;
using log4net.Appender;
using log4net.Core;
using log4net.Repository.Hierarchy;
using Microsoft.Owin;
using Owin;
using Owin.WebSocket;
using Owin.WebSocket.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.WebSockets;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
//[assembly: OwinStartup(typeof(WebSocketsStartup))]
namespace WebSockets.Startup
{
public class WebSocketsStartup
{
public static IList OpenConnections = new List();
public class MyWebSocket : WebSocketConnection
{
public override async Task OnMessageReceived(ArraySegment message, WebSocketMessageType type)
{
//Handle the message from the client
//Example of JSON serialization with the client
//var json = Encoding.UTF8.GetString(message.Array, message.Offset, message.Count);
//Use something like Json.Net to read the json
}
public override void OnOpen()
{
OpenConnections.Add(this);
}
public override void OnClose(WebSocketCloseStatus? closeStatus, string closeStatusDescription)
{
OpenConnections.Remove(this);
}
//public override bool Authenticate(IOwinRequest request){return true;}
}
public class MyLogAppender : AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
var message = $"{loggingEvent.Level} {loggingEvent.RenderedMessage}";
var data = Encoding.UTF8.GetBytes(message);
foreach (var connection in OpenConnections)
{
connection.SendText(data, true);
}
}
}
public static Task GetLogViewer()
{
var assembly = Assembly.GetExecutingAssembly();
//assembly.GetManifestResourceNames();
var resourceName = "WebSockets.Pages.LogViewer.html";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEndAsync();
}
}
public static void Configuration(IAppBuilder app)
{
var defaultLogger = LoggingHelper.Logger;
defaultLogger.Info("Adding custom logappender");
Hierarchy h = (Hierarchy)log4net.LogManager.GetRepository();
Logger rootLogger = h.Root;
((log4net.Repository.Hierarchy.Logger)rootLogger).AddAppender(new MyLogAppender());
app.Map("/debuglog", appBuilder =>
{
appBuilder.Run(async context =>
{
SetCorsHeaders(context);
var content = await GetLogViewer();
await context.Response.WriteAsync(content);
});
});
app.MapWebSocketRoute("/ws");
}
private static void SetCorsHeaders(IOwinContext context)
{
try
{
context.Response.Headers["Access-Control-Allow-Origin"] = "*";
context.Response.Headers["Access-Control-Allow-Headers"] = context.Request.Headers.Get("Access-Control-Request-Headers");
context.Response.Headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS";
context.Response.Headers["Access-Control-Expose-Headers"] = "Content-Disposition, X-Total-Count, X-Employer-Code";
}
catch (Exception)
{
// ignore
}
}
private static void ConfigureCors(IAppBuilder app)
{
app.MapWhen(ctx => ctx.Request.Method.Equals("OPTIONS", System.StringComparison.OrdinalIgnoreCase), appBuilder =>
{
appBuilder.Run(context =>
{
SetCorsHeaders(context);
return context.Response.WriteAsync("");
});
});
app.Use(async (context, next) =>
{
SetCorsHeaders(context);
await next();
SetCorsHeaders(context);
});
}
}
}
94700cookie-checkLog4net get root logger and add custom appender