UPDATED 2014.04.12: latest version of SignalR used and all other packages.
The idea of this example is to create a simple SignalR service, so that all Log messages can be sent to a client browser in real time.
In the example, EventSource classes are used to send the logs to the ETW. Semantic Logging OUT-OF-PROCESS is then used to log to the database. The SignalR framework will be added to the application and the EventSource class will be extended.
Code https://github.com/damienbod/MvcTestSignalR
The example continues on from the code found here:
Part 3 Enterprise Library 6, Unity 3 and MVC 4, Registration by Convention Part 3
Or direct from github https://github.com/damienbod/MvcUnityBootstrapperTestPart3
Step 1: Add SignalR using nuget:
Step 2: In the Global.asax add RouteTable.Routes.MapHubs(); to the Application_Start method
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
Step 3: Create a new Startup class for the OWIN config, SignalR start method:
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(MvcUnityBootstrapperTest.Startup))] namespace MvcUnityBootstrapperTest { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } }
Step 4: Create a SignalR Hub class. This class requires no methods as the log only pushes to the clients, no clients push to the server.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; namespace MvcUnityBootstrapperTest.Logging { public class DiagnosisEventSourceService : Hub { } }
Step 5: Extend the EventSource class. Add a IHubContext
private IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<DiagnosisEventSourceService>();
And in each event add a hubContext.Clients.All.addDiagnosisMessage method. The addDiagnosisMessage now needs to be defined in javascript on the client.
hubContext.Clients.All.addDiagnosisMessage("UnityLogger", createUnityMessageEventId, DateTime.Now.ToString(CultureInfo.InvariantCulture), "CreateUnityMessage: " + message + " EventLevel.Informational");
Step 6: Create a Diagnosis view. Add the following:
@{ ViewBag.Title = "SignalR Diagnosis Example"; } <h2>SignalR Diagnosis Example</h2> <div class="container"> <ol id="discussion"> </ol> </div> @section scripts { <!--Script references. --> <!--The jQuery library is required and is referenced by default in _Layout.cshtml. --> <!--Reference the SignalR library. --> <script src="~/Scripts/jquery.signalR-2.0.3.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="~/signalr/hubs"></script> <!--SignalR script to update the chat page and send messages.--> <script> $(function () { // Reference the auto-generated proxy for the hub. var signalRService = $.connection.diagnosisEventSourceService; // Create a function that the hub can call back to display messages. signalRService.client.addDiagnosisMessage = function (providerName, timestamp, eventId, message) { // Add the message to the page. $('#discussion').append('<li><strong>' + htmlEncode(providerName) + '</strong>: ' + htmlEncode(timestamp) + ', ' + htmlEncode(eventId) + ', ' + htmlEncode(message) + '</li>'); }; // Start the connection. $.connection.hub.start(); }); // This optional function html-encodes messages for display in the page. function htmlEncode(value) { var encodedValue = $('<div />').text(value).html(); return encodedValue; } </script> }
Now all Events will be sent to the diagnosis view in real time when the view is opened.
Links:
http://signalr.net/
https://github.com/SignalR/SignalR
http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc-4
http://en.wikipedia.org/wiki/SignalR
http://www.west-wind.com/weblog/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service
http://www.asp.net/signalr/overview/getting-started/tutorial-signalr-self-host
Maybe using DIAGNOSIS USING SIGNALR, with Serilog in NET 6 minimal API and Blazor Server App ?