diff --git a/Squirrowse.Service/Hubs/IStreamHub.cs b/Squirrowse.Service/Hubs/IStreamHub.cs new file mode 100644 index 0000000..b73fa0b --- /dev/null +++ b/Squirrowse.Service/Hubs/IStreamHub.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Squirrowse.Service.Hubs +{ + public interface IStreamHub + { + Task UploadByteStream(IAsyncEnumerable stream); + } +} \ No newline at end of file diff --git a/Squirrowse.Service/Hubs/StreamHub.cs b/Squirrowse.Service/Hubs/StreamHub.cs new file mode 100644 index 0000000..0db5054 --- /dev/null +++ b/Squirrowse.Service/Hubs/StreamHub.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.AccessControl; +using System.Threading.Tasks; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using NLog; + +namespace Squirrowse.Service.Hubs +{ + public class StreamHub : Hub, IStreamHub + { + private readonly ILogger logger; + + public StreamHub(ILogger logger) + { + this.logger = logger; + } + public async Task UploadByteStream(IAsyncEnumerable stream) + { + await foreach (var frame in stream) + { + logger.LogInformation($"Got frame size: {frame.Length} "); + await Task.Delay(100); //leave some delay for debug purpose + } + } + } +} diff --git a/Squirrowse.Service/Program.cs b/Squirrowse.Service/Program.cs index 367ed08..7fc9e0e 100644 --- a/Squirrowse.Service/Program.cs +++ b/Squirrowse.Service/Program.cs @@ -1,26 +1,68 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - +using NLog; +using NLog.Extensions.Logging; +using NLog.Web; namespace Squirrowse.Service { public class Program { + public static IConfigurationRoot Configuration { get; set; } + public static void Main(string[] args) { - CreateHostBuilder(args).Build().Run(); + Configuration = CreateConfigurationBuilder().Build(); + var logger = GetLogger(); + try + { + logger.Debug("Application started"); + CreateHostBuilder(args) + .Build() + .Run(); + } + catch (Exception ex) + { + logger.Error(ex, "Stopped program because of exception when building WebHost"); + throw; + } + finally + { + LogManager.Shutdown(); + } } - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); + webBuilder.UseConfiguration(Configuration); + webBuilder.UseNLog(); }); + } + + private static IConfigurationBuilder CreateConfigurationBuilder() + { + var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + return new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", false, true) + .AddJsonFile($"appsettings.{environment}.json", false, true); + } + + private static ILogger GetLogger() + { + var nlogConfigSection = Configuration.GetSection("NLog"); + LogManager.Configuration = new NLogLoggingConfiguration(nlogConfigSection); + ILogger logger = LogManager.GetCurrentClassLogger(); + return logger; + } } } diff --git a/Squirrowse.Service/Properties/launchSettings.json b/Squirrowse.Service/Properties/launchSettings.json index 8249223..c54b9fa 100644 --- a/Squirrowse.Service/Properties/launchSettings.json +++ b/Squirrowse.Service/Properties/launchSettings.json @@ -11,8 +11,8 @@ "profiles": { "IIS Express": { "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", + "launchBrowser": false, + "launchUrl": "", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/Squirrowse.Service/Squirrowse.Service.csproj b/Squirrowse.Service/Squirrowse.Service.csproj index 33dd274..e0927c4 100644 --- a/Squirrowse.Service/Squirrowse.Service.csproj +++ b/Squirrowse.Service/Squirrowse.Service.csproj @@ -11,6 +11,7 @@ + diff --git a/Squirrowse.Service/Startup.cs b/Squirrowse.Service/Startup.cs index 31e5ebb..2f12361 100644 --- a/Squirrowse.Service/Startup.cs +++ b/Squirrowse.Service/Startup.cs @@ -1,15 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; +using Squirrowse.Service.Hubs; namespace Squirrowse.Service { @@ -26,15 +20,15 @@ namespace Squirrowse.Service public void ConfigureServices(IServiceCollection services) { services.AddControllers(); + services.AddSignalR() + .AddHubOptions(opt => opt.MaximumReceiveMessageSize = 102400000)//~100mb per frame instead of 32kb default + .AddMessagePackProtocol(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } + if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseHttpsRedirection(); @@ -45,7 +39,8 @@ namespace Squirrowse.Service app.UseEndpoints(endpoints => { endpoints.MapControllers(); + endpoints.MapHub($"{nameof(StreamHub)}"); }); } } -} +} \ No newline at end of file diff --git a/Squirrowse.Service/appsettings.json b/Squirrowse.Service/appsettings.json index d9d9a9b..0a501d7 100644 --- a/Squirrowse.Service/appsettings.json +++ b/Squirrowse.Service/appsettings.json @@ -6,5 +6,36 @@ "Microsoft.Hosting.Lifetime": "Information" } }, + "NLog": { + "autoreload": true, + "throwConfigExceptions": true, + "variables": { + "logDirectory": "${basedir}/logs" + }, + "targets": { + "FileLogger": { + "type": "AsyncWrapper", + "target": { + "wrappedFile": { + "type": "File", + "fileName": "${logDirectory}/${machinename}.Log.txt", + "layout": "${longdate} ${level}: ${message} ${exception:format=tostring}", + "archiveFileName": "${logDirectory}/archives/${machinename}.Log_{#}.txt", + "archiveDateFormat": "yyyy-MM-dd", + "archiveAboveSize": "5242880", + "archiveEvery": "Day", + "archiveNumbering": "DateAndSequence", + "maxArchiveFiles": "90" + } + } + } + }, + "rules": [ + { + "logger": "*", + "writeTo": "FileLogger" + } + ] + }, "AllowedHosts": "*" -} +} \ No newline at end of file