From 3b434d6240d315c62c8b439a7a285ab251a26ec6 Mon Sep 17 00:00:00 2001 From: Tolga Kayhan Date: Tue, 26 Mar 2024 22:39:19 +0000 Subject: [PATCH] .NET 8 update and improvments --- ...tEyes.DataServiceSdk.DotNetStandard.csproj | 41 ----- .../LaserCatEyesDataService.cs | 104 ------------ .../LaserCatEyes_Logo.png | Bin 82940 -> 0 bytes .../README.md | 28 ---- ...aserCatEyes.DataServiceSdk.UnitTest.csproj | 20 --- .../LaserCatEyes.DataServiceSdk.csproj | 24 ++- .../LaserCatEyesDataService.cs | 82 +++++---- .../LaserCatEyes.Domain.UnitTest.csproj | 93 ----------- .../Properties/AssemblyInfo.cs | 20 --- LaserCatEyes.Domain.UnitTest/packages.config | 12 -- .../ILaserCatEyesDataService.cs | 13 +- .../LaserCatEyes.Domain.csproj | 5 +- LaserCatEyes.Domain/Models/Constants.cs | 19 +-- .../Models/LaserCatEyesOptions.cs | 40 +++-- .../Models/LaserCatEyesSystemOptions.cs | 25 ++- LaserCatEyes.Domain/Models/MethodType.cs | 23 ++- LaserCatEyes.Domain/Models/PackageData.cs | 55 +++--- LaserCatEyes.Domain/Models/RequestPackage.cs | 34 ++-- LaserCatEyes.Domain/Models/ResponsePackage.cs | 26 +-- LaserCatEyes.Domain/Models/SubAppUpdate.cs | 35 ++-- .../Models/SubAppUpdateResponseModel.cs | 9 +- LaserCatEyes.Domain/Utilities.cs | 136 +++++++-------- LaserCatEyes.DotNetSdk.sln | 14 -- .../HttpListenerMiddleware.cs | 109 ++++++------ .../LaserCatEyes.EndpointListener.csproj | 20 ++- ...LaserCatEyesServiceCollectionExtensions.cs | 65 ++++--- .../Properties/launchSettings.json | 12 ++ ...s.HttpClientListener.DotNetStandard.csproj | 40 ----- .../LaserCatEyesHttpMessageHandler.cs | 49 ------ ...LaserCatEyesServiceCollectionExtensions.cs | 41 ----- .../LaserCatEyes_Logo.png | Bin 82940 -> 0 bytes .../PackageDataHelper.cs | 33 ---- .../README.md | 63 ------- .../LaserCatEyes.HttpClientListener.csproj | 19 ++- .../LaserCatEyesHttpMessageHandler.cs | 26 ++- .../PackageDataHelper.cs | 6 +- .../LaserCatEyes.WCFListener.csproj | 8 +- .../LaserCatEyesMessageInspector.cs | 71 ++++---- ...LaserCatEyesServiceCollectionExtensions.cs | 39 +++-- .../LoggingEndpointBehaviour.cs | 38 ++--- LaserCatEyes.WCFListener/PackageDataHelper.cs | 92 +++++----- Sample/SampleDotNetCoreClientApp/Program.cs | 158 +++++++++--------- .../SampleDotNetCoreClientApp.csproj | 6 +- .../Controllers/WeatherForecastController.cs | 74 ++++---- Sample/SampleNetServerApp/Program.cs | 49 ++++-- .../SampleNetServerApp.csproj | 4 +- Sample/SampleNetServerApp/Startup.cs | 57 ------- Sample/SampleNetServerApp/WeatherForecast.cs | 29 ++-- SampleFunctionServerApp/local.settings.json | 7 - 49 files changed, 710 insertions(+), 1263 deletions(-) delete mode 100644 LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes.DataServiceSdk.DotNetStandard.csproj delete mode 100644 LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyesDataService.cs delete mode 100644 LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes_Logo.png delete mode 100644 LaserCatEyes.DataServiceSdk.DotNetStandard/README.md delete mode 100644 LaserCatEyes.DataServiceSdk.UnitTest/LaserCatEyes.DataServiceSdk.UnitTest.csproj delete mode 100644 LaserCatEyes.Domain.UnitTest/LaserCatEyes.Domain.UnitTest.csproj delete mode 100644 LaserCatEyes.Domain.UnitTest/Properties/AssemblyInfo.cs delete mode 100644 LaserCatEyes.Domain.UnitTest/packages.config create mode 100644 LaserCatEyes.EndpointListener/Properties/launchSettings.json delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes.HttpClientListener.DotNetStandard.csproj delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesHttpMessageHandler.cs delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesServiceCollectionExtensions.cs delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes_Logo.png delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/PackageDataHelper.cs delete mode 100644 LaserCatEyes.HttpClientListener.DotNetStandard/README.md delete mode 100644 Sample/SampleNetServerApp/Startup.cs delete mode 100644 SampleFunctionServerApp/local.settings.json diff --git a/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes.DataServiceSdk.DotNetStandard.csproj b/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes.DataServiceSdk.DotNetStandard.csproj deleted file mode 100644 index 7d56b77..0000000 --- a/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes.DataServiceSdk.DotNetStandard.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - netstandard2.0 - Betalgo Up Ltd. - https://portal.lasercateyes.com - LaserCatEyes_Logo.png - true - 1.0.6 - Betalgo Up Ltd. - Betalgo Up Ltd. - Laser Cat Eyes - - lasercateyes.com - Laser Cat Eyes is an online debugging tool that can capture, inspect, monitor all HTTP/HTTPS traffic from your application. It contains a network function like diagnose network issues, etc. - - With Laser Cat Eyes all team members can remotely display in realtime all traffic smoothly that other members capture in their device. It allows team members to test and debug scripts right along with each other in realtime remotely. Laser Cat Eyes is a comprehensive helper to save time, to improve productivity with its easy to use layout, also it helps to play a lot with request and response. - - All internal traffics that we are sending and receiving between the web browser/client and the server is invisible, and this brings difficulty, stress. Determining where is the fault exactly is a time-consuming process, a small error can sometimes take hours to debug with different browsers, operating systems, and devices, bugs are inevitable. Laser Cat Eyes offers extensive features that make it easy to see what is happening, so you debug your application effectively, quickly diagnose, and fix problems. - - https://github.com/betalgo/LCE-DotNet-SDK - network, debugging - README.md - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyesDataService.cs b/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyesDataService.cs deleted file mode 100644 index a1f2f92..0000000 --- a/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyesDataService.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Net.Http; -using System.Threading.Tasks; -using LaserCatEyes.Domain; -using LaserCatEyes.Domain.Models; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -namespace LaserCatEyes.DataServiceSdk.DotNetStandard -{ - public class LaserCatEyesDataService : ILaserCatEyesDataService - { - private readonly HttpClient _client = HttpClientFactory.Create(new HttpClientHandler() - { - ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true - }); - - private readonly Guid _deviceId; - private readonly LaserCatEyesOptions _laserCatEyesOptions; - private readonly LaserCatEyesSystemOptions _laserCatEyesSystemOptions; - private readonly bool _serviceReady; - - public LaserCatEyesDataService(IOptions laserCatEyesOptions, IOptions laserCatEyesSystemOptions, ILogger logger) - { - _laserCatEyesOptions = laserCatEyesOptions.Value; - _laserCatEyesSystemOptions = laserCatEyesSystemOptions.Value; - - if (string.IsNullOrEmpty(_laserCatEyesOptions.AppKey)) - { - logger.LogWarning("LaserCatEyes AppKey is NULL!"); - return; - } - - var deviceName = $"{Environment.MachineName}:{Environment.UserName}"; - if (_laserCatEyesOptions.DeviceUuid == null) - { - _laserCatEyesOptions.DeviceUuid = Utilities.ToGuid(deviceName); - } - - var subApp = new SubAppUpdate - { - Device = new Device - { - Name = deviceName, - OSVersion = Environment.OSVersion.Version.ToString(), - OperatingSystem = Environment.OSVersion.VersionString.Replace(Environment.OSVersion.Version.ToString(), ""), - UUID = _laserCatEyesOptions.DeviceUuid.ToString(), - UserFriendlyName = _laserCatEyesOptions.DeviceUserFriendlyName - }, - OperatingSystem = Environment.OSVersion.VersionString.Replace(Environment.OSVersion.Version.ToString(), ""), - Name = _laserCatEyesOptions.AppName ?? "Unknown", - Environment = _laserCatEyesOptions.AspCoreEnvironment, - Version = _laserCatEyesOptions.Version, - BuildNumber = _laserCatEyesOptions.BuildNumber - }; - - _client.BaseAddress = new Uri(_laserCatEyesSystemOptions.BaseAddress); - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaClientId, _laserCatEyesSystemOptions.AlgoronaClientId); - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaCulture, _laserCatEyesSystemOptions.AlgoronaCulture); - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaDeviceUuid, _laserCatEyesOptions.DeviceUuid.ToString()); - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaAppKey, _laserCatEyesOptions.AppKey); - - var httpResponseMessage = Init(subApp).Result; - _deviceId = httpResponseMessage.Content.ReadAsAsync().Result.DeviceId; - - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaDeviceId, _deviceId.ToString()); - _serviceReady = true; - } - - - public async Task ReportTask(PackageData data) - { - if (!_serviceReady) - { - return null; - } - - data.DeviceUuid = _laserCatEyesOptions.DeviceUuid; - data.DeviceId = _deviceId; - return await _client.PostAsJsonAsync(_laserCatEyesSystemOptions.Endpoints.DataSendPackage, data); - } - - - public bool IsServiceReady() - { - return _serviceReady; - } - - public void Report(PackageData data) - { - if (!_serviceReady) - { - return; - } - - Task.Run(() => ReportTask(data)).Forget(); - } - - private async Task Init(SubAppUpdate data) - { - return await _client.PutAsJsonAsync(_laserCatEyesSystemOptions.Endpoints.AppUpdateSubApp, data); - } - } -} \ No newline at end of file diff --git a/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes_Logo.png b/LaserCatEyes.DataServiceSdk.DotNetStandard/LaserCatEyes_Logo.png deleted file mode 100644 index c0a05201a5ea7ad5c6596d5976bb120a8d0be296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82940 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
  • 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 -[Laser Cat Eyes]: - -## Author - - Betalgo, mail@betalgo.com diff --git a/LaserCatEyes.DataServiceSdk.UnitTest/LaserCatEyes.DataServiceSdk.UnitTest.csproj b/LaserCatEyes.DataServiceSdk.UnitTest/LaserCatEyes.DataServiceSdk.UnitTest.csproj deleted file mode 100644 index 879ea97..0000000 --- a/LaserCatEyes.DataServiceSdk.UnitTest/LaserCatEyes.DataServiceSdk.UnitTest.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - netcoreapp3.1 - - false - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - diff --git a/LaserCatEyes.DataServiceSdk/LaserCatEyes.DataServiceSdk.csproj b/LaserCatEyes.DataServiceSdk/LaserCatEyes.DataServiceSdk.csproj index 0424893..8a45d72 100644 --- a/LaserCatEyes.DataServiceSdk/LaserCatEyes.DataServiceSdk.csproj +++ b/LaserCatEyes.DataServiceSdk/LaserCatEyes.DataServiceSdk.csproj @@ -1,12 +1,13 @@  - net6.0 + net8.0;net6.0;netstandard2.0 Betalgo Up Ltd. + Latest https://portal.lasercateyes.com LaserCatEyes_Logo.png true - 6.0.0 + 8.0.0 Betalgo Up Ltd. Betalgo Up Ltd. Laser Cat Eyes @@ -23,13 +24,24 @@ README.md - - + + - + + + + + + + + + + + + + - diff --git a/LaserCatEyes.DataServiceSdk/LaserCatEyesDataService.cs b/LaserCatEyes.DataServiceSdk/LaserCatEyesDataService.cs index 46b6b7f..fae18c4 100644 --- a/LaserCatEyes.DataServiceSdk/LaserCatEyesDataService.cs +++ b/LaserCatEyes.DataServiceSdk/LaserCatEyesDataService.cs @@ -6,21 +6,27 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace LaserCatEyes.DataServiceSdk +namespace LaserCatEyes.DataServiceSdk; + +public class LaserCatEyesDataService : ILaserCatEyesDataService { - public class LaserCatEyesDataService : ILaserCatEyesDataService + private const string AlgoronaClientId = "989C784C-2EB2-4666-8796-D7494EBB745D"; + + private readonly HttpClient _client = HttpClientFactory.Create(new HttpClientHandler() { - private readonly HttpClient _client = HttpClientFactory.Create(new HttpClientHandler() - { - ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true - }); + ServerCertificateCustomValidationCallback = (_, _, _, _) => true + }); - private readonly Guid _deviceId; - private readonly LaserCatEyesOptions _laserCatEyesOptions; - private readonly LaserCatEyesSystemOptions _laserCatEyesSystemOptions; - private readonly bool _serviceReady; + private readonly Guid _deviceId; + private readonly LaserCatEyesOptions _laserCatEyesOptions; + private readonly LaserCatEyesSystemOptions _laserCatEyesSystemOptions; + private readonly ILogger _logger; + private readonly bool _serviceReady; - public LaserCatEyesDataService(IOptions laserCatEyesOptions, IOptions laserCatEyesSystemOptions, ILogger logger) + public LaserCatEyesDataService(IOptions laserCatEyesOptions, IOptions laserCatEyesSystemOptions, ILogger logger) + { + _logger = logger; + try { _laserCatEyesOptions = laserCatEyesOptions.Value; _laserCatEyesSystemOptions = laserCatEyesSystemOptions.Value; @@ -34,7 +40,7 @@ public LaserCatEyesDataService(IOptions laserCatEyesOptions var deviceName = $"{Environment.MachineName}:{Environment.UserName}"; _laserCatEyesOptions.DeviceUuid ??= Utilities.ToGuid(deviceName); - var subApp = new SubAppUpdate + SubAppUpdate subApp = new() { Device = new Device { @@ -52,7 +58,7 @@ public LaserCatEyesDataService(IOptions laserCatEyesOptions }; _client.BaseAddress = new Uri(_laserCatEyesSystemOptions.BaseAddress); - _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaClientId, _laserCatEyesSystemOptions.AlgoronaClientId); + _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaClientId, !string.IsNullOrEmpty(_laserCatEyesSystemOptions.AlgoronaClientId) ? _laserCatEyesSystemOptions.AlgoronaClientId : AlgoronaClientId); _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaCulture, _laserCatEyesSystemOptions.AlgoronaCulture); _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaDeviceUuid, _laserCatEyesOptions.DeviceUuid.ToString()); _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaAppKey, _laserCatEyesOptions.AppKey); @@ -63,39 +69,51 @@ public LaserCatEyesDataService(IOptions laserCatEyesOptions _client.DefaultRequestHeaders.Add(Constants.Headers.AlgoronaDeviceId, _deviceId.ToString()); _serviceReady = true; } + catch (Exception e) + { + logger.LogError(e, "LaserCatEyes Error on initialization"); + } + } - public async Task ReportTask(PackageData data) + public async Task ReportTask(PackageData data) + { + if (!_serviceReady) { - if (!_serviceReady) - { - return null; - } + return null; + } + try + { data.DeviceUuid = _laserCatEyesOptions.DeviceUuid; data.DeviceId = _deviceId; return await _client.PostAsJsonAsync(_laserCatEyesSystemOptions.Endpoints.DataSendPackage, data); } - - - public bool IsServiceReady() + catch (Exception e) { - return _serviceReady; + _logger.LogError(e, "LaserCatEyes Error on initialization"); + return null; } + } - public void Report(PackageData data) - { - if (!_serviceReady) - { - return; - } - Task.Run(() => ReportTask(data)).Forget(); - } + public bool IsServiceReady() + { + return _serviceReady; + } - private async Task Init(SubAppUpdate data) + public void Report(PackageData data) + { + if (!_serviceReady) { - return await _client.PutAsJsonAsync(_laserCatEyesSystemOptions.Endpoints.AppUpdateSubApp, data); + return; } + + Task.Run(() => ReportTask(data)).Forget(); + } + + private async Task Init(SubAppUpdate data) + { + return await _client.PutAsJsonAsync(_laserCatEyesSystemOptions.Endpoints.AppUpdateSubApp, data); } } \ No newline at end of file diff --git a/LaserCatEyes.Domain.UnitTest/LaserCatEyes.Domain.UnitTest.csproj b/LaserCatEyes.Domain.UnitTest/LaserCatEyes.Domain.UnitTest.csproj deleted file mode 100644 index a87613a..0000000 --- a/LaserCatEyes.Domain.UnitTest/LaserCatEyes.Domain.UnitTest.csproj +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - Debug - AnyCPU - {19B14D60-5A91-4561-B694-97F0EE8CA0D8} - Library - Properties - LaserCatEyes.Domain.UnitTest - LaserCatEyes.Domain.UnitTest - v4.7.2 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - ..\packages\xunit.abstractions.2.0.3\lib\net35\xunit.abstractions.dll - - - ..\packages\xunit.assert.2.4.1\lib\netstandard1.1\xunit.assert.dll - - - ..\packages\xunit.extensibility.core.2.4.1\lib\net452\xunit.core.dll - - - ..\packages\xunit.extensibility.execution.2.4.1\lib\net452\xunit.execution.desktop.dll - - - - - - - - - - - - - - {97F1C3A7-028E-4A5A-8F4C-6357FF55444D} - LaserCatEyes.Domain - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/LaserCatEyes.Domain.UnitTest/Properties/AssemblyInfo.cs b/LaserCatEyes.Domain.UnitTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 13803d3..0000000 --- a/LaserCatEyes.Domain.UnitTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("LaserCatEyes.Domain.UnitTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("LaserCatEyes.Domain.UnitTest")] -[assembly: AssemblyCopyright("Copyright © 2021")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("19b14d60-5a91-4561-b694-97f0ee8ca0d8")] - -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LaserCatEyes.Domain.UnitTest/packages.config b/LaserCatEyes.Domain.UnitTest/packages.config deleted file mode 100644 index d7ab219..0000000 --- a/LaserCatEyes.Domain.UnitTest/packages.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/LaserCatEyes.Domain/ILaserCatEyesDataService.cs b/LaserCatEyes.Domain/ILaserCatEyesDataService.cs index a8da4dc..d494af7 100644 --- a/LaserCatEyes.Domain/ILaserCatEyesDataService.cs +++ b/LaserCatEyes.Domain/ILaserCatEyesDataService.cs @@ -2,12 +2,11 @@ using System.Threading.Tasks; using LaserCatEyes.Domain.Models; -namespace LaserCatEyes.Domain +namespace LaserCatEyes.Domain; + +public interface ILaserCatEyesDataService { - public interface ILaserCatEyesDataService - { - bool IsServiceReady(); - void Report(PackageData data); - Task ReportTask(PackageData data); - } + bool IsServiceReady(); + void Report(PackageData data); + Task ReportTask(PackageData data); } \ No newline at end of file diff --git a/LaserCatEyes.Domain/LaserCatEyes.Domain.csproj b/LaserCatEyes.Domain/LaserCatEyes.Domain.csproj index 977cef5..817ed7a 100644 --- a/LaserCatEyes.Domain/LaserCatEyes.Domain.csproj +++ b/LaserCatEyes.Domain/LaserCatEyes.Domain.csproj @@ -1,11 +1,12 @@  - netstandard2.0 + net8.0;net6.0;netstandard2.0 Betalgo Up Ltd. + Latest https://portal.lasercateyes.com LaserCatEyes_Logo.png true - 1.0.6 + 8.0.0 Betalgo Up Ltd. Betalgo Up Ltd. Laser Cat Eyes diff --git a/LaserCatEyes.Domain/Models/Constants.cs b/LaserCatEyes.Domain/Models/Constants.cs index 6fd3333..ad50c53 100644 --- a/LaserCatEyes.Domain/Models/Constants.cs +++ b/LaserCatEyes.Domain/Models/Constants.cs @@ -1,14 +1,13 @@ -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class Constants { - public class Constants + public class Headers { - public class Headers - { - public const string AlgoronaAppKey = "Alg-App-Key"; - public const string AlgoronaClientId = "Alg-Client-Id"; - public const string AlgoronaCulture = "Alg-Culture"; - public const string AlgoronaDeviceUuid = "Alg-Device-Uuid"; - public const string AlgoronaDeviceId = "Alg-Device-Id"; - } + public const string AlgoronaAppKey = "Alg-App-Key"; + public const string AlgoronaClientId = "Alg-Client-Id"; + public const string AlgoronaCulture = "Alg-Culture"; + public const string AlgoronaDeviceUuid = "Alg-Device-Uuid"; + public const string AlgoronaDeviceId = "Alg-Device-Id"; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/LaserCatEyesOptions.cs b/LaserCatEyes.Domain/Models/LaserCatEyesOptions.cs index 67ce6d5..4d002cb 100644 --- a/LaserCatEyes.Domain/Models/LaserCatEyesOptions.cs +++ b/LaserCatEyes.Domain/Models/LaserCatEyesOptions.cs @@ -1,26 +1,32 @@ using System; -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class LaserCatEyesOptions { - public class LaserCatEyesOptions + public static string SettingKey = "LaserCatEyesOptions"; + + public LaserCatEyesOptions(string appKey) { - public static string SettingKey = "LaserCatEyesOptions"; + AppKey = appKey; + } + + public LaserCatEyesOptions() + { + } - public LaserCatEyesOptions(string appKey) - { - AppKey = appKey; - } - public LaserCatEyesOptions() - { - } + public string AppKey { get; set; } + public string DeviceUserFriendlyName { get; set; } = $"{Environment.MachineName}:{Environment.UserName}:{GetEnvironmentVariable()}"; + public string Version { get; set; } = "0"; + public string BuildNumber { get; set; } = "0.0.0.0"; + public Guid? DeviceUuid { get; set; } + public string AppName { get; set; } = Environment.GetEnvironmentVariable("IISEXPRESS_SITENAME"); + public string AspCoreEnvironment { get; set; } = GetEnvironmentVariable(); - public string AppKey { get; set; } - public string DeviceUserFriendlyName { get; set; } = $"{Environment.MachineName}:{Environment.UserName}:{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}"; - public string Version { get; set; } = "0"; - public string BuildNumber { get; set; } = "0.0.0.0"; - public Guid? DeviceUuid { get; set; } - public string AppName { get; set; } = Environment.GetEnvironmentVariable("IISEXPRESS_SITENAME"); - public string AspCoreEnvironment { get; set; } = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + private static string GetEnvironmentVariable() + { + var value = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + return string.IsNullOrEmpty(value) ? Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") : value; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/LaserCatEyesSystemOptions.cs b/LaserCatEyes.Domain/Models/LaserCatEyesSystemOptions.cs index 403d5b2..fb44e3f 100644 --- a/LaserCatEyes.Domain/Models/LaserCatEyesSystemOptions.cs +++ b/LaserCatEyes.Domain/Models/LaserCatEyesSystemOptions.cs @@ -1,18 +1,17 @@ -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class LaserCatEyesSystemOptions { - public class LaserCatEyesSystemOptions - { - public static string SettingKey = "LaserCatEyesSystemOptions"; + public static string SettingKey = "LaserCatEyesSystemOptions"; - public string BaseAddress { get; set; } = "https://data.lasercateyes.com/"; - public string AlgoronaClientId { get; set; } = "33f4bbd2-4765-4336-a352-79fb7ff53921"; - public string AlgoronaCulture { get; set; } = "en-US"; - public EndpointPaths Endpoints { get; set; } = new EndpointPaths(); + public string BaseAddress { get; set; } = "https://data.lasercateyes.com/"; + public string AlgoronaClientId { get; set; } + public string AlgoronaCulture { get; set; } = "en-US"; + public EndpointPaths Endpoints { get; set; } = new(); - public class EndpointPaths - { - public string DataSendPackage { get; set; } = "/api/Data/SendPackage"; - public string AppUpdateSubApp { get; set; } = "/api/App/UpdateSubApp"; - } + public class EndpointPaths + { + public string DataSendPackage { get; set; } = "/api/Data/SendPackage"; + public string AppUpdateSubApp { get; set; } = "/api/App/UpdateSubApp"; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/MethodType.cs b/LaserCatEyes.Domain/Models/MethodType.cs index 8e2efc0..185dc93 100644 --- a/LaserCatEyes.Domain/Models/MethodType.cs +++ b/LaserCatEyes.Domain/Models/MethodType.cs @@ -1,16 +1,15 @@ // ReSharper disable InconsistentNaming -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public enum MethodType { - public enum MethodType - { - GET, - POST, - PUT, - DELETE, - HEAD, - OPTIONS, - PATCH, - TRACE - } + GET, + POST, + PUT, + DELETE, + HEAD, + OPTIONS, + PATCH, + TRACE } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/PackageData.cs b/LaserCatEyes.Domain/Models/PackageData.cs index 10a80b4..8305e5e 100644 --- a/LaserCatEyes.Domain/Models/PackageData.cs +++ b/LaserCatEyes.Domain/Models/PackageData.cs @@ -1,38 +1,37 @@ using System; using System.Collections.Generic; -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class PackageData { - public class PackageData - { - public Guid Id { get; set; } - public RequestPackage RequestPackage { get; set; } - public ResponsePackage ResponsePackage { get; set; } - public List Tags { get; set; } - public Guid? DeviceId { get; set; } - public Guid? DeviceUuid { get; set; } - public Guid? AppId { get; set; } - public string LocalIpAddress { get; set; } - public string RemoteIpAddress { get; set; } + public Guid Id { get; set; } + public RequestPackage RequestPackage { get; set; } + public ResponsePackage ResponsePackage { get; set; } + public List Tags { get; set; } + public Guid? DeviceId { get; set; } + public Guid? DeviceUuid { get; set; } + public Guid? AppId { get; set; } + public string LocalIpAddress { get; set; } + public string RemoteIpAddress { get; set; } - public static PackageData CreateRequestPackage(Guid id, string url, MethodType methodType, List headers, string body, DateTime? timeStamp, string localIpAddress, string remoteIpAddress) + public static PackageData CreateRequestPackage(Guid id, string url, MethodType methodType, List headers, string body, DateTime? timeStamp, string localIpAddress, string remoteIpAddress) + { + return new PackageData { - return new PackageData - { - Id = id, - RequestPackage = new RequestPackage(id, url, methodType, headers, body, timeStamp), - LocalIpAddress = localIpAddress, - RemoteIpAddress = remoteIpAddress - }; - } + Id = id, + RequestPackage = new RequestPackage(id, url, methodType, headers, body, timeStamp), + LocalIpAddress = localIpAddress, + RemoteIpAddress = remoteIpAddress + }; + } - public static PackageData CreateResponsePackage(Guid id, int? statusCode, List headers, string body, DateTime? timeStamp) + public static PackageData CreateResponsePackage(Guid id, int? statusCode, List headers, string body, DateTime? timeStamp) + { + return new PackageData { - return new PackageData - { - Id = id, - ResponsePackage = new ResponsePackage(id, statusCode, headers, body, timeStamp) - }; - } + Id = id, + ResponsePackage = new ResponsePackage(id, statusCode, headers, body, timeStamp) + }; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/RequestPackage.cs b/LaserCatEyes.Domain/Models/RequestPackage.cs index 164c1f7..6929260 100644 --- a/LaserCatEyes.Domain/Models/RequestPackage.cs +++ b/LaserCatEyes.Domain/Models/RequestPackage.cs @@ -1,25 +1,21 @@ using System; using System.Collections.Generic; -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class RequestPackage(Guid id, string url, MethodType methodType, List headers, string body, DateTime? timeStamp) { - public class RequestPackage - { - public RequestPackage(Guid id, string url, MethodType methodType, List headers, string body, DateTime? timeStamp) - { - Id = id; - Url = url; - MethodType = methodType; - Headers = headers; - Body = body; - TimeStamp = timeStamp ?? DateTime.UtcNow; - } + public Guid Id { get; set; } = id; + public DateTime TimeStamp { get; set; } = timeStamp ?? DateTime.UtcNow; + public string Url { get; set; } = url; + public List HeaderCouples { get; set; } = headers; + + public string Body { get; set; } = body; + public MethodType MethodType { get; set; } = methodType; +} - public Guid Id { get; set; } - public DateTime TimeStamp { get; set; } - public string Url { get; set; } - public List Headers { get; set; } - public string Body { get; set; } - public MethodType MethodType { get; set; } - } +public class HeaderCouple(string key, string value) +{ + public string Key { get; set; } = key; + public string Value { get; set; } = value; } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/ResponsePackage.cs b/LaserCatEyes.Domain/Models/ResponsePackage.cs index d41d188..93667b7 100644 --- a/LaserCatEyes.Domain/Models/ResponsePackage.cs +++ b/LaserCatEyes.Domain/Models/ResponsePackage.cs @@ -1,23 +1,13 @@ using System; using System.Collections.Generic; -namespace LaserCatEyes.Domain.Models -{ - public class ResponsePackage - { - public ResponsePackage(Guid id, int? statusCode, List headers, string body, DateTime? timeStamp) - { - Id = id; - StatusCode = statusCode; - Headers = headers; - Body = body; - TimeStamp = timeStamp ?? DateTime.UtcNow; - } +namespace LaserCatEyes.Domain.Models; - public Guid Id { get; set; } - public DateTime TimeStamp { get; set; } - public int? StatusCode { get; set; } - public List Headers { get; set; } - public string Body { get; set; } - } +public class ResponsePackage(Guid id, int? statusCode, List headerCouples, string body, DateTime? timeStamp) +{ + public Guid Id { get; set; } = id; + public DateTime TimeStamp { get; set; } = timeStamp ?? DateTime.UtcNow; + public int? StatusCode { get; set; } = statusCode; + public List HeaderCouples { get; set; } = headerCouples; + public string Body { get; set; } = body; } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/SubAppUpdate.cs b/LaserCatEyes.Domain/Models/SubAppUpdate.cs index 149db86..d3b94a9 100644 --- a/LaserCatEyes.Domain/Models/SubAppUpdate.cs +++ b/LaserCatEyes.Domain/Models/SubAppUpdate.cs @@ -1,21 +1,20 @@ -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class SubAppUpdate { - public class SubAppUpdate - { - public string OperatingSystem { get; set; } - public string Name { get; set; } - public string Environment { get; set; } - public string Version { get; set; } - public Device Device { get; set; } - public string BuildNumber { get; set; } - } + public string OperatingSystem { get; set; } + public string Name { get; set; } + public string Environment { get; set; } + public string Version { get; set; } + public Device Device { get; set; } + public string BuildNumber { get; set; } +} - public class Device - { - public string Name { get; set; } - public string UserFriendlyName { get; set; } - public string UUID { get; set; } - public string OperatingSystem { get; set; } - public string OSVersion { get; set; } - } +public class Device +{ + public string Name { get; set; } + public string UserFriendlyName { get; set; } + public string UUID { get; set; } + public string OperatingSystem { get; set; } + public string OSVersion { get; set; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Models/SubAppUpdateResponseModel.cs b/LaserCatEyes.Domain/Models/SubAppUpdateResponseModel.cs index 4d455ba..4cd236e 100644 --- a/LaserCatEyes.Domain/Models/SubAppUpdateResponseModel.cs +++ b/LaserCatEyes.Domain/Models/SubAppUpdateResponseModel.cs @@ -1,9 +1,8 @@ using System; -namespace LaserCatEyes.Domain.Models +namespace LaserCatEyes.Domain.Models; + +public class SubAppUpdateResponseModel { - public class SubAppUpdateResponseModel - { - public Guid DeviceId { get; set; } - } + public Guid DeviceId { get; set; } } \ No newline at end of file diff --git a/LaserCatEyes.Domain/Utilities.cs b/LaserCatEyes.Domain/Utilities.cs index 85b2572..2a399d2 100644 --- a/LaserCatEyes.Domain/Utilities.cs +++ b/LaserCatEyes.Domain/Utilities.cs @@ -6,93 +6,87 @@ using System.Threading.Tasks; using LaserCatEyes.Domain.Models; -namespace LaserCatEyes.Domain +namespace LaserCatEyes.Domain; + +public static class Utilities { - public static class Utilities + public static void Forget(this Task task) { - public static void Forget(this Task task) + // note: this code is inspired by a tweet from Ben Adams: https://twitter.com/ben_a_adams/status/1045060828700037125 + // Only care about tasks that may fault (not completed) or are faulted, + // so fast-path for SuccessfullyCompleted and Canceled tasks. + if (!task.IsCompleted || task.IsFaulted) { - // note: this code is inspired by a tweet from Ben Adams: https://twitter.com/ben_a_adams/status/1045060828700037125 - // Only care about tasks that may fault (not completed) or are faulted, - // so fast-path for SuccessfullyCompleted and Canceled tasks. - if (!task.IsCompleted || task.IsFaulted) - { - // use "_" (Discard operation) to remove the warning IDE0058: Because this call is not awaited, execution of the current method continues before the call is completed - // https://docs.microsoft.com/en-us/dotnet/csharp/discards#a-standalone-discard - _ = ForgetAwaited(task); - } - - // Allocate the async/await state machine only when needed for performance reason. - // More info about the state machine: https://blogs.msdn.microsoft.com/seteplia/2017/11/30/dissecting-the-async-methods-in-c/ - async Task ForgetAwaited(Task taskToForget) - { - try - { - // No need to resume on the original SynchronizationContext, so use ConfigureAwait(false) - await taskToForget.ConfigureAwait(false); - } - catch - { - // Nothing to do here - } - } + // use "_" (Discard operation) to remove the warning IDE0058: Because this call is not awaited, execution of the current method continues before the call is completed + // https://docs.microsoft.com/en-us/dotnet/csharp/discards#a-standalone-discard + _ = ForgetAwaited(task); } - public static MethodType HttpMethodStringToEnumConverter(string method) - { - switch (method.ToUpper()) - { - case "GET": - return MethodType.GET; - case "POST": - return MethodType.POST; - case "PUT": - return MethodType.PUT; - case "DELETE": - return MethodType.DELETE; - case "HEAD": - return MethodType.HEAD; - case "OPTIONS": - return MethodType.OPTIONS; - case "PATCH": - return MethodType.PATCH; - case "TRACE": - return MethodType.TRACE; - default: - throw new InvalidEnumArgumentException(); - } - } + return; - public static async Task ReadBodyStream(Stream body) + // Allocate the async/await state machine only when needed for performance reason. + // More info about the state machine: https://blogs.msdn.microsoft.com/seteplia/2017/11/30/dissecting-the-async-methods-in-c/ + static async Task ForgetAwaited(Task taskToForget) { - if (!body.CanRead) + try { - return null; + // No need to resume on the original SynchronizationContext, so use ConfigureAwait(false) + await taskToForget.ConfigureAwait(false); } - - if (body.Length == 0) + catch { - return null; + // Nothing to do here } + } + } - string bodyString; - using (var reader = new StreamReader(body)) - { - body.Position = 0; - bodyString = await reader.ReadToEndAsync().ConfigureAwait(false); - body.Position = 0; - } + public static MethodType HttpMethodStringToEnumConverter(string method) + { + return method.ToUpper() switch + { + "GET" => MethodType.GET, + "POST" => MethodType.POST, + "PUT" => MethodType.PUT, + "DELETE" => MethodType.DELETE, + "HEAD" => MethodType.HEAD, + "OPTIONS" => MethodType.OPTIONS, + "PATCH" => MethodType.PATCH, + "TRACE" => MethodType.TRACE, + _ => throw new InvalidEnumArgumentException() + }; + } - return bodyString; + public static async Task ReadBodyStream(Stream body) + { + if (!body.CanRead) + { + return null; } - public static Guid ToGuid(string src) + if (body.Length == 0) { - var stringBytes = Encoding.UTF8.GetBytes(src); - var hashedBytes = new SHA1CryptoServiceProvider() - .ComputeHash(stringBytes); - Array.Resize(ref hashedBytes, 16); - return new Guid(hashedBytes); + return null; } + + using StreamReader reader = new(body); + body.Position = 0; + var bodyString = await reader.ReadToEndAsync().ConfigureAwait(false); + body.Position = 0; + + return bodyString; + } + + public static Guid ToGuid(string src) + { + var stringBytes = Encoding.UTF8.GetBytes(src); +#if NET6_0_OR_GREATER + var hashedBytes = SHA1.HashData(stringBytes); +#else + var hashedBytes = new SHA1CryptoServiceProvider() + .ComputeHash(stringBytes); +#endif + + Array.Resize(ref hashedBytes, 16); + return new Guid(hashedBytes); } } \ No newline at end of file diff --git a/LaserCatEyes.DotNetSdk.sln b/LaserCatEyes.DotNetSdk.sln index e38b606..f921c5f 100644 --- a/LaserCatEyes.DotNetSdk.sln +++ b/LaserCatEyes.DotNetSdk.sln @@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.EndpointListen EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.DataServiceSdk", "LaserCatEyes.DataServiceSdk\LaserCatEyes.DataServiceSdk.csproj", "{F9A2B11A-1DA8-4C22-9F79-5E3D90ED6333}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.DataServiceSdk.DotNetStandard", "LaserCatEyes.DataServiceSdk.DotNetStandard\LaserCatEyes.DataServiceSdk.DotNetStandard.csproj", "{8855FA72-F61F-456B-AE58-7624651EF5DC}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.Domain", "LaserCatEyes.Domain\LaserCatEyes.Domain.csproj", "{97F1C3A7-028E-4A5A-8F4C-6357FF55444D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DotNetStandard", "DotNetStandard", "{35E9EDC4-69A4-4BC8-976A-7A3C817BAB41}" @@ -17,8 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DotNetCore", "DotNetCore", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.HttpClientListener", "LaserCatEyes.HttpClientListener\LaserCatEyes.HttpClientListener.csproj", "{5977C50D-83B2-4654-9EAF-385B0AC18E32}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LaserCatEyes.HttpClientListener.DotNetStandard", "LaserCatEyes.HttpClientListener.DotNetStandard\LaserCatEyes.HttpClientListener.DotNetStandard.csproj", "{90B7CFC5-A04D-48D2-BA0D-46533540BF6F}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{E2B713C8-7C45-4632-8DB0-DC133E5CB6F0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Documentation", "Documentation", "{55D7CEB2-7296-41D6-BA9D-2BA597B2AD03}" @@ -55,10 +51,6 @@ Global {F9A2B11A-1DA8-4C22-9F79-5E3D90ED6333}.Debug|Any CPU.Build.0 = Debug|Any CPU {F9A2B11A-1DA8-4C22-9F79-5E3D90ED6333}.Release|Any CPU.ActiveCfg = Release|Any CPU {F9A2B11A-1DA8-4C22-9F79-5E3D90ED6333}.Release|Any CPU.Build.0 = Release|Any CPU - {8855FA72-F61F-456B-AE58-7624651EF5DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8855FA72-F61F-456B-AE58-7624651EF5DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8855FA72-F61F-456B-AE58-7624651EF5DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8855FA72-F61F-456B-AE58-7624651EF5DC}.Release|Any CPU.Build.0 = Release|Any CPU {97F1C3A7-028E-4A5A-8F4C-6357FF55444D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97F1C3A7-028E-4A5A-8F4C-6357FF55444D}.Debug|Any CPU.Build.0 = Debug|Any CPU {97F1C3A7-028E-4A5A-8F4C-6357FF55444D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -67,10 +59,6 @@ Global {5977C50D-83B2-4654-9EAF-385B0AC18E32}.Debug|Any CPU.Build.0 = Debug|Any CPU {5977C50D-83B2-4654-9EAF-385B0AC18E32}.Release|Any CPU.ActiveCfg = Release|Any CPU {5977C50D-83B2-4654-9EAF-385B0AC18E32}.Release|Any CPU.Build.0 = Release|Any CPU - {90B7CFC5-A04D-48D2-BA0D-46533540BF6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90B7CFC5-A04D-48D2-BA0D-46533540BF6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90B7CFC5-A04D-48D2-BA0D-46533540BF6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90B7CFC5-A04D-48D2-BA0D-46533540BF6F}.Release|Any CPU.Build.0 = Release|Any CPU {7E774EBE-B681-430A-AC2A-2F28474E08F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E774EBE-B681-430A-AC2A-2F28474E08F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E774EBE-B681-430A-AC2A-2F28474E08F3}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -90,12 +78,10 @@ Global GlobalSection(NestedProjects) = preSolution {6953B012-1F16-4C86-AB74-23C4F5FC3ED1} = {ACE7AFE5-4429-49C6-A091-38BBE9C74411} {F9A2B11A-1DA8-4C22-9F79-5E3D90ED6333} = {ACE7AFE5-4429-49C6-A091-38BBE9C74411} - {8855FA72-F61F-456B-AE58-7624651EF5DC} = {35E9EDC4-69A4-4BC8-976A-7A3C817BAB41} {97F1C3A7-028E-4A5A-8F4C-6357FF55444D} = {E2B713C8-7C45-4632-8DB0-DC133E5CB6F0} {35E9EDC4-69A4-4BC8-976A-7A3C817BAB41} = {E2B713C8-7C45-4632-8DB0-DC133E5CB6F0} {ACE7AFE5-4429-49C6-A091-38BBE9C74411} = {E2B713C8-7C45-4632-8DB0-DC133E5CB6F0} {5977C50D-83B2-4654-9EAF-385B0AC18E32} = {ACE7AFE5-4429-49C6-A091-38BBE9C74411} - {90B7CFC5-A04D-48D2-BA0D-46533540BF6F} = {35E9EDC4-69A4-4BC8-976A-7A3C817BAB41} {FCEE9B6D-C73A-41EB-9293-1B32E919E45A} = {2AB160A4-6D9A-43DE-B2D5-E4096B0443D2} {68BACA33-4244-4F4E-B03B-55084CED5461} = {2AB160A4-6D9A-43DE-B2D5-E4096B0443D2} {7E774EBE-B681-430A-AC2A-2F28474E08F3} = {5E92817F-20C0-4D02-8698-D9F7FBA95FAC} diff --git a/LaserCatEyes.EndpointListener/HttpListenerMiddleware.cs b/LaserCatEyes.EndpointListener/HttpListenerMiddleware.cs index e167d80..44f6fe3 100644 --- a/LaserCatEyes.EndpointListener/HttpListenerMiddleware.cs +++ b/LaserCatEyes.EndpointListener/HttpListenerMiddleware.cs @@ -7,68 +7,77 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; -namespace LaserCatEyes.EndpointListener +namespace LaserCatEyes.EndpointListener; + +public class EndpointListenerMiddleware : IMiddleware { - public class EndpointListenerMiddleware : IMiddleware + private readonly bool _isServiceReady; + private readonly ILaserCatEyesDataService _laserCatEyesDataService; + + public EndpointListenerMiddleware(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger) { - private readonly bool _isServiceReady; - private readonly ILaserCatEyesDataService _laserCatEyesDataService; + if (laserCatEyesDataService == null) + { + logger.LogWarning($"Couldn't bind {nameof(EndpointListenerMiddleware)} because {nameof(ILaserCatEyesDataService)} is null"); + return; + } - public EndpointListenerMiddleware(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger) + if (!laserCatEyesDataService.IsServiceReady()) { - if (laserCatEyesDataService == null) - { - logger.LogWarning($"Couldn't bind {nameof(EndpointListenerMiddleware)} because {nameof(ILaserCatEyesDataService)} is null"); - return; - } + logger.LogWarning($"Couldn't bind {nameof(EndpointListenerMiddleware)} because {nameof(ILaserCatEyesDataService)} was not ready"); + return; + } - if (!laserCatEyesDataService.IsServiceReady()) - { - logger.LogWarning($"Couldn't bind {nameof(EndpointListenerMiddleware)} because {nameof(ILaserCatEyesDataService)} was not ready"); - return; - } + _laserCatEyesDataService = laserCatEyesDataService; + _isServiceReady = true; + } - _laserCatEyesDataService = laserCatEyesDataService; - _isServiceReady = true; + public async Task InvokeAsync(HttpContext context, RequestDelegate next) + { + if (context?.Request == null || !_isServiceReady) + { + await next(context); + return; } - public async Task InvokeAsync(HttpContext context, RequestDelegate next) - { - if (context?.Request == null || !_isServiceReady) - { - await next(context); - return; - } + var operationId = Guid.NewGuid(); +#if NET6_0_OR_GREATER + context.Request.EnableBuffering(); +#else + context.Request.EnableRewind(); +#endif - var operationId = Guid.NewGuid(); + _laserCatEyesDataService.Report(PackageData.CreateRequestPackage( + operationId, + $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}", + Utilities.HttpMethodStringToEnumConverter(context.Request.Method), + context.Request.Headers?.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(), + await Utilities.ReadBodyStream(context.Request.Body), + DateTime.UtcNow, + context.Connection?.LocalIpAddress?.ToString(), + context.Connection?.RemoteIpAddress?.ToString() + )); - context.Request.EnableBuffering(); - _laserCatEyesDataService.Report(PackageData.CreateRequestPackage( - operationId, - $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}", - Utilities.HttpMethodStringToEnumConverter(context.Request.Method), - context.Request.Headers?.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), - await Utilities.ReadBodyStream(context.Request.Body), - DateTime.UtcNow, - context.Connection?.LocalIpAddress?.ToString(), - context.Connection?.RemoteIpAddress?.ToString() - )); + var originalResponseBody = context.Response.Body; + MemoryStream replacementResponseBody = new(); + context.Response.Body = replacementResponseBody; - var originalResponseBody = context.Response.Body; - await using var replacementResponseBody = new MemoryStream(); - context.Response.Body = replacementResponseBody; + await next(context); - await next(context); + replacementResponseBody.Position = 0; + await replacementResponseBody.CopyToAsync(originalResponseBody); + context.Response.Body = originalResponseBody; + _laserCatEyesDataService.Report(PackageData.CreateResponsePackage( + operationId, + context.Response.StatusCode, + context.Response.Headers.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(), + await Utilities.ReadBodyStream(replacementResponseBody), + DateTime.UtcNow)); - replacementResponseBody.Position = 0; - await replacementResponseBody.CopyToAsync(originalResponseBody); - context.Response.Body = originalResponseBody; - _laserCatEyesDataService.Report(PackageData.CreateResponsePackage( - operationId, - context.Response.StatusCode, - context.Response.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), - await Utilities.ReadBodyStream(replacementResponseBody), - DateTime.UtcNow)); - } +#if NET6_0_OR_GREATER + await replacementResponseBody.DisposeAsync(); +#else + replacementResponseBody.Dispose(); +#endif } } \ No newline at end of file diff --git a/LaserCatEyes.EndpointListener/LaserCatEyes.EndpointListener.csproj b/LaserCatEyes.EndpointListener/LaserCatEyes.EndpointListener.csproj index 88408f2..1007d2c 100644 --- a/LaserCatEyes.EndpointListener/LaserCatEyes.EndpointListener.csproj +++ b/LaserCatEyes.EndpointListener/LaserCatEyes.EndpointListener.csproj @@ -1,12 +1,13 @@  - net6.0 + net8.0;net6.0; Betalgo Up Ltd. + Latest https://portal.lasercateyes.com LaserCatEyes_Logo.png true - 6.0.0 + 8.0.0 Betalgo Up Ltd. Betalgo Up Ltd. Laser Cat Eyes @@ -28,15 +29,18 @@ - - + + + + + + + + - - - + - diff --git a/LaserCatEyes.EndpointListener/LaserCatEyesServiceCollectionExtensions.cs b/LaserCatEyes.EndpointListener/LaserCatEyesServiceCollectionExtensions.cs index cc9c391..a431ea6 100644 --- a/LaserCatEyes.EndpointListener/LaserCatEyesServiceCollectionExtensions.cs +++ b/LaserCatEyes.EndpointListener/LaserCatEyesServiceCollectionExtensions.cs @@ -8,46 +8,45 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -namespace LaserCatEyes.EndpointListener +namespace LaserCatEyes.EndpointListener; + +public static class LaserCatEyesServiceCollectionExtensions { - public static class LaserCatEyesServiceCollectionExtensions + public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services, Action setupAction) { - public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services, Action setupAction) - { - services.TryAddSingleton>(new ConfigureNamedOptions(setupAction.Method.Name, setupAction)); - return AddLaserCatEyesEndpointListenerBase(services); - } - - public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services) - { - var configuration = services.BuildServiceProvider().GetRequiredService(); - services.Configure(configuration.GetSection(LaserCatEyesOptions.SettingKey)); - - if (configuration.GetSection(LaserCatEyesSystemOptions.SettingKey) != null) - { - services.Configure(configuration.GetSection(LaserCatEyesSystemOptions.SettingKey)); - } + services.TryAddSingleton>(new ConfigureNamedOptions(setupAction.Method.Name, setupAction)); + return AddLaserCatEyesEndpointListenerBase(services); + } - return AddLaserCatEyesEndpointListenerBase(services); - } + public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services) + { + var configuration = services.BuildServiceProvider().GetRequiredService(); + services.Configure(configuration.GetSection(LaserCatEyesOptions.SettingKey)); - public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services, string appKey) + if (configuration.GetSection(LaserCatEyesSystemOptions.SettingKey) != null) { - services.TryAddSingleton(Options.Create(new LaserCatEyesOptions(appKey))); - return AddLaserCatEyesEndpointListenerBase(services); + services.Configure(configuration.GetSection(LaserCatEyesSystemOptions.SettingKey)); } - private static IServiceCollection AddLaserCatEyesEndpointListenerBase(IServiceCollection services) - { - services.TryAddSingleton(); - services.AddTransient(); - return services; - } + return AddLaserCatEyesEndpointListenerBase(services); + } - public static IApplicationBuilder UseLaserCatEyesEndpointListenerMiddleware(this IApplicationBuilder services) - { - services.UseMiddleware(); - return services; - } + public static IServiceCollection AddLaserCatEyesEndpointListener(this IServiceCollection services, string appKey) + { + services.TryAddSingleton(Options.Create(new LaserCatEyesOptions(appKey))); + return AddLaserCatEyesEndpointListenerBase(services); + } + + private static IServiceCollection AddLaserCatEyesEndpointListenerBase(IServiceCollection services) + { + services.TryAddSingleton(); + services.AddTransient(); + return services; + } + + public static IApplicationBuilder UseLaserCatEyesEndpointListenerMiddleware(this IApplicationBuilder services) + { + services.UseMiddleware(); + return services; } } \ No newline at end of file diff --git a/LaserCatEyes.EndpointListener/Properties/launchSettings.json b/LaserCatEyes.EndpointListener/Properties/launchSettings.json new file mode 100644 index 0000000..d18cad2 --- /dev/null +++ b/LaserCatEyes.EndpointListener/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "LaserCatEyes.EndpointListener": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:50977;http://localhost:50978" + } + } +} \ No newline at end of file diff --git a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes.HttpClientListener.DotNetStandard.csproj b/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes.HttpClientListener.DotNetStandard.csproj deleted file mode 100644 index 09617ae..0000000 --- a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes.HttpClientListener.DotNetStandard.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - netstandard2.0 - Betalgo Up Ltd. - https://portal.lasercateyes.com - LaserCatEyes_Logo.png - true - 1.0.6 - Betalgo Up Ltd. - Betalgo Up Ltd. - Laser Cat Eyes - - lasercateyes.com - Laser Cat Eyes is an online debugging tool that can capture, inspect, monitor all HTTP/HTTPS traffic from your application. It contains a network function like diagnose network issues, etc. - - With Laser Cat Eyes all team members can remotely display in realtime all traffic smoothly that other members capture in their device. It allows team members to test and debug scripts right along with each other in realtime remotely. Laser Cat Eyes is a comprehensive helper to save time, to improve productivity with its easy to use layout, also it helps to play a lot with request and response. - - All internal traffics that we are sending and receiving between the web browser/client and the server is invisible, and this brings difficulty, stress. Determining where is the fault exactly is a time-consuming process, a small error can sometimes take hours to debug with different browsers, operating systems, and devices, bugs are inevitable. Laser Cat Eyes offers extensive features that make it easy to see what is happening, so you debug your application effectively, quickly diagnose, and fix problems. - - https://github.com/betalgo/LCE-DotNet-SDK - network, debugging - README.md - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesHttpMessageHandler.cs b/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesHttpMessageHandler.cs deleted file mode 100644 index 9e2c0fc..0000000 --- a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesHttpMessageHandler.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using LaserCatEyes.Domain; -using Microsoft.Extensions.Logging; - -namespace LaserCatEyes.HttpClientListener.DotNetStandard -{ - public class LaserCatEyesHttpMessageHandler : DelegatingHandler - { - private readonly ILaserCatEyesDataService _laserCatEyesDataService; - private readonly bool _serviceReady; - - public LaserCatEyesHttpMessageHandler(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger) - { - if (laserCatEyesDataService == null) - { - logger.LogWarning($"Couldn't bind {nameof(LaserCatEyesHttpMessageHandler)} because {nameof(ILaserCatEyesDataService)} is null"); - return; - } - - if (!laserCatEyesDataService.IsServiceReady()) - { - logger.LogWarning($"Couldn't bind {nameof(LaserCatEyesHttpMessageHandler)} because {nameof(ILaserCatEyesDataService)} was not ready"); - return; - } - - _laserCatEyesDataService = laserCatEyesDataService; - _serviceReady = true; - } - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - if (request == null || !_serviceReady) - { - return await base.SendAsync(request, cancellationToken); - } - - var operationId = Guid.NewGuid(); - _laserCatEyesDataService.Report(PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, request)); - - var response = await base.SendAsync(request, cancellationToken); - - _laserCatEyesDataService.Report(PackageDataHelper.ResponsePackageDataFromHttpResponseMessage(operationId, response)); - return response; - } - } -} \ No newline at end of file diff --git a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesServiceCollectionExtensions.cs b/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesServiceCollectionExtensions.cs deleted file mode 100644 index 77d42ed..0000000 --- a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyesServiceCollectionExtensions.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using LaserCatEyes.DataServiceSdk.DotNetStandard; -using LaserCatEyes.Domain; -using LaserCatEyes.Domain.Models; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Http; -using Microsoft.Extensions.Options; - -namespace LaserCatEyes.HttpClientListener.DotNetStandard -{ - public static class HttpClientListenerServiceCollectionExtensions - { - public static IServiceCollection AddLaserCatEyesHttpClientListener(this IServiceCollection services, string appKey, bool listenAllHttpClients = true) - { - services.TryAddSingleton(Options.Create(new LaserCatEyesOptions(appKey))); - return AddLaserCatEyesHttpClientListenerBase(services, listenAllHttpClients); - } - - public static IServiceCollection AddLaserCatEyesHttpClientListener(this IServiceCollection services, Action setupAction, bool listenAllHttpClients = true) - { - services.TryAddSingleton>(new ConfigureNamedOptions(setupAction.Method.Name, setupAction)); - return AddLaserCatEyesHttpClientListenerBase(services, listenAllHttpClients); - } - - private static IServiceCollection AddLaserCatEyesHttpClientListenerBase(IServiceCollection services, bool listenAllHttpClients) - { - services.TryAddSingleton(); - services.AddTransient(); - if (listenAllHttpClients) - { - services.ConfigureAll(options => - { - options.HttpMessageHandlerBuilderActions.Add(builder => { builder.AdditionalHandlers.Add(builder.Services.GetRequiredService()); }); - }); - } - - return services; - } - } -} \ No newline at end of file diff --git a/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes_Logo.png b/LaserCatEyes.HttpClientListener.DotNetStandard/LaserCatEyes_Logo.png deleted file mode 100644 index c0a05201a5ea7ad5c6596d5976bb120a8d0be296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82940 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
  • 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 r.Value.Select(value => $"{r.Key}:{value}")).ToList(), - request.Content?.ReadAsStringAsync().Result, - DateTime.UtcNow, - null, - null); - } - - public static PackageData ResponsePackageDataFromHttpResponseMessage(Guid id, HttpResponseMessage response) - { - return PackageData.CreateResponsePackage( - id, - (int) response.StatusCode, response.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), - response.Content.ReadAsStringAsync().Result, - DateTime.UtcNow); - } - } -} \ No newline at end of file diff --git a/LaserCatEyes.HttpClientListener.DotNetStandard/README.md b/LaserCatEyes.HttpClientListener.DotNetStandard/README.md deleted file mode 100644 index a994eb1..0000000 --- a/LaserCatEyes.HttpClientListener.DotNetStandard/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# LaserCatEyes DotNet SDK - currently in BETA program -![.NET](https://github.com/betalgo/LCE-DotNet-SDK/workflows/.NET/badge.svg?branch=master) - -[![LaserCatEyes.HttpClientListener.DotNetStandard](https://img.shields.io/nuget/v/LaserCatEyes.HttpClientListener.DotNetStandard?label=nuget.LaserCatEyes.HttpClientListener.DotNetStandard)](https://www.nuget.org/packages/LaserCatEyes.HttpClientListener.DotNetStandard/) - -[Laser Cat Eyes] is a network monitoring tool that helps mobile app developers diagnose issues between their apps and backend services. - -### Hot to get your APP_KEY : -1. Create an account from [Laser-Cat-Eyes web portal] -2. Create an app -3. After the hitting save button you should be able to see your **APP KEY** - -``` -### Installation & Implementation of HttpClient Listener -1. LaserCatEyes is available through [Nuget](https://www.nuget.org/packages/LaserCatEyes.HttpClientListener.DotNetStandard/). -First, [install NuGet](http://docs.nuget.org/docs/start-here/installing-nuget). Then, install [LaserCatEyes.HttpClientListener](https://www.nuget.org/packages/LaserCatEyes.HttpClientListener.DotNetStandard/) from the package manager console: -``` -PM> Install-Package LaserCatEyes.HttpClientListener.DotNetStandard -``` - -2. In ``Startup`` class ``ConfigureServices`` method inject add Endpoint Listener - -#### To listen all HttpClients -```csharp - public void ConfigureServices(IServiceCollection services) - { - if (CurrentEnvironment.IsDevelopment()) //This is a debugging tool, you don't want to run it in production, right!? - { - //Seriously don't run it in production environment - services.AddLaserCatEyesHttpClientListener(MY_APP_KEY_FROM_LASER_CAT_EYES_PORTAL); - services.AddLaserCatEyesHttpClientListener(option => - { - option.AppKey = ""; - option.AspCoreEnvironment = ""; - option.Version = "1.2.3.4"; - option.BuildNumber = "1"; - }); - } - } -``` -or -#### Listen only selected HttpClients -```csharp - public void ConfigureServices(IServiceCollection services) - { - if (CurrentEnvironment.IsDevelopment()) //This is a debugging tool, you don't want to run it in production, right!? - { - //Seriously don't run it in production environment - services.AddLaserCatEyesHttpClientListener(MY_APP_KEY_FROM_LASER_CAT_EYES_PORTAL, listenAllHttpClients: false); - services.AddHttpClient("myClient", c => - { - //your settings - }).AddHttpMessageHandler(); - } - } -``` - -[Laser-Cat-Eyes web portal]: -[Laser Cat Eyes]: - -## Author - - Betalgo, mail@betalgo.com diff --git a/LaserCatEyes.HttpClientListener/LaserCatEyes.HttpClientListener.csproj b/LaserCatEyes.HttpClientListener/LaserCatEyes.HttpClientListener.csproj index 1086a4a..50f3565 100644 --- a/LaserCatEyes.HttpClientListener/LaserCatEyes.HttpClientListener.csproj +++ b/LaserCatEyes.HttpClientListener/LaserCatEyes.HttpClientListener.csproj @@ -1,12 +1,13 @@  - net6.0 + net8.0;net6.0;netstandard2.0 Betalgo Up Ltd. + Latest https://portal.lasercateyes.com LaserCatEyes_Logo.png true - 6.0.0 + 8.0.0 Betalgo Up Ltd. Betalgo Up Ltd. Laser Cat Eyes @@ -31,16 +32,20 @@ 9 - + + + + + + + + + - - - - diff --git a/LaserCatEyes.HttpClientListener/LaserCatEyesHttpMessageHandler.cs b/LaserCatEyes.HttpClientListener/LaserCatEyesHttpMessageHandler.cs index 570b95d..9faf6a4 100644 --- a/LaserCatEyes.HttpClientListener/LaserCatEyesHttpMessageHandler.cs +++ b/LaserCatEyes.HttpClientListener/LaserCatEyesHttpMessageHandler.cs @@ -10,23 +10,25 @@ namespace LaserCatEyes.HttpClientListener public class LaserCatEyesHttpMessageHandler : DelegatingHandler { private readonly ILaserCatEyesDataService _laserCatEyesDataService; + private readonly ILogger _logger; private readonly bool _serviceReady; public LaserCatEyesHttpMessageHandler(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger) { if (laserCatEyesDataService == null) { - logger.LogWarning($"Couldn't bind {nameof(LaserCatEyesHttpMessageHandler)} because {nameof(ILaserCatEyesDataService)} is null"); + logger.LogWarning("Couldn't bind LaserCatEyesHttpMessageHandler because ILaserCatEyesDataService is null"); return; } if (!laserCatEyesDataService.IsServiceReady()) { - logger.LogWarning($"Couldn't bind {nameof(LaserCatEyesHttpMessageHandler)} because {nameof(ILaserCatEyesDataService)} was not ready"); + logger.LogWarning("Couldn't bind LaserCatEyesHttpMessageHandler because ILaserCatEyesDataService was not ready"); return; } _laserCatEyesDataService = laserCatEyesDataService; + _logger = logger; _serviceReady = true; } @@ -38,11 +40,27 @@ protected override async Task SendAsync(HttpRequestMessage } var operationId = Guid.NewGuid(); - _laserCatEyesDataService.Report(PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, request)); + try + { + _laserCatEyesDataService.Report(PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, request)); + } + catch (Exception e) + { + _logger.LogError(e, "Error while reporting request package data"); + } + var response = await base.SendAsync(request, cancellationToken); + try + { + _laserCatEyesDataService.Report(PackageDataHelper.ResponsePackageDataFromHttpResponseMessage(operationId, response)); + } + catch (Exception e) + { + _logger.LogError(e, "Error while reporting response package data"); + } + - _laserCatEyesDataService.Report(PackageDataHelper.ResponsePackageDataFromHttpResponseMessage(operationId, response)); return response; } } diff --git a/LaserCatEyes.HttpClientListener/PackageDataHelper.cs b/LaserCatEyes.HttpClientListener/PackageDataHelper.cs index ac77d67..64afbad 100644 --- a/LaserCatEyes.HttpClientListener/PackageDataHelper.cs +++ b/LaserCatEyes.HttpClientListener/PackageDataHelper.cs @@ -12,9 +12,9 @@ public static PackageData RequestPackageDataFromHttpRequestMessage(Guid id, Http { return PackageData.CreateRequestPackage( id, - request.RequestUri.ToString(), + request.RequestUri?.ToString(), Utilities.HttpMethodStringToEnumConverter(request.Method.Method), - request.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), + request.Headers.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(), request.Content?.ReadAsStringAsync().Result, DateTime.UtcNow, null, @@ -25,7 +25,7 @@ public static PackageData ResponsePackageDataFromHttpResponseMessage(Guid id, Ht { return PackageData.CreateResponsePackage( id, - (int) response.StatusCode, response.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), + (int)response.StatusCode, response.Headers.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(), response.Content.ReadAsStringAsync().Result, DateTime.UtcNow); } diff --git a/LaserCatEyes.WCFListener/LaserCatEyes.WCFListener.csproj b/LaserCatEyes.WCFListener/LaserCatEyes.WCFListener.csproj index a9418ef..92046f7 100644 --- a/LaserCatEyes.WCFListener/LaserCatEyes.WCFListener.csproj +++ b/LaserCatEyes.WCFListener/LaserCatEyes.WCFListener.csproj @@ -2,10 +2,11 @@ netstandard2.1 Betalgo Up Ltd. + Latest https://portal.lasercateyes.com LaserCatEyes_Logo.png true - 1.0.6 + 8.0.0 Betalgo Up Ltd. Betalgo Up Ltd. Laser Cat Eyes @@ -23,8 +24,6 @@ - - @@ -35,7 +34,6 @@ - - + \ No newline at end of file diff --git a/LaserCatEyes.WCFListener/LaserCatEyesMessageInspector.cs b/LaserCatEyes.WCFListener/LaserCatEyesMessageInspector.cs index ebe5b5f..f861a20 100644 --- a/LaserCatEyes.WCFListener/LaserCatEyesMessageInspector.cs +++ b/LaserCatEyes.WCFListener/LaserCatEyesMessageInspector.cs @@ -6,52 +6,51 @@ using LaserCatEyes.Domain.Models; using Microsoft.Extensions.Logging; -namespace LaserCatEyes.WCFListener +namespace LaserCatEyes.WCFListener; + +public class LaserCatEyesMessageInspector : IClientMessageInspector { - public class LaserCatEyesMessageInspector : IClientMessageInspector - { - private readonly ILaserCatEyesDataService _laserCatEyesDataService; - private readonly bool _serviceReady; + private readonly ILaserCatEyesDataService _laserCatEyesDataService; + private readonly bool _serviceReady; - public LaserCatEyesMessageInspector(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger = null) + public LaserCatEyesMessageInspector(ILaserCatEyesDataService laserCatEyesDataService, ILogger logger = null) + { + if (laserCatEyesDataService == null) { - if (laserCatEyesDataService == null) - { - logger?.LogWarning($"Couldn't bind {nameof(LaserCatEyesMessageInspector)} because {nameof(ILaserCatEyesDataService)} is null"); - return; - } - - if (!laserCatEyesDataService.IsServiceReady()) - { - logger?.LogWarning($"Couldn't bind {nameof(LaserCatEyesMessageInspector)} because {nameof(ILaserCatEyesDataService)} was not ready"); - return; - } - - _laserCatEyesDataService = laserCatEyesDataService; - _serviceReady = true; + logger?.LogWarning($"Couldn't bind {nameof(LaserCatEyesMessageInspector)} because {nameof(ILaserCatEyesDataService)} is null"); + return; } - public object BeforeSendRequest(ref Message request, IClientChannel channel) + if (!laserCatEyesDataService.IsServiceReady()) { - if (!_serviceReady) - { - return null!; - } - - var operationId = Guid.NewGuid(); - //TODO Update this whenever backend start to accept updating request object - //laserCatEyesDataService!.Report(PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, ref request)); - return PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, ref request); + logger?.LogWarning($"Couldn't bind {nameof(LaserCatEyesMessageInspector)} because {nameof(ILaserCatEyesDataService)} was not ready"); + return; } - public void AfterReceiveReply(ref Message reply, object correlationState) + _laserCatEyesDataService = laserCatEyesDataService; + _serviceReady = true; + } + + public object BeforeSendRequest(ref Message request, IClientChannel channel) + { + if (!_serviceReady) { - if (!_serviceReady) - { - return; - } + return null!; + } + + var operationId = Guid.NewGuid(); + //TODO Update this whenever backend start to accept updating request object + //laserCatEyesDataService!.Report(PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, ref request)); + return PackageDataHelper.RequestPackageDataFromHttpRequestMessage(operationId, ref request); + } - _laserCatEyesDataService!.Report(PackageDataHelper.ResponsePackageDataFromHttpResponseMessage((PackageData) correlationState, ref reply)); + public void AfterReceiveReply(ref Message reply, object correlationState) + { + if (!_serviceReady) + { + return; } + + _laserCatEyesDataService!.Report(PackageDataHelper.ResponsePackageDataFromHttpResponseMessage((PackageData)correlationState, ref reply)); } } \ No newline at end of file diff --git a/LaserCatEyes.WCFListener/LaserCatEyesServiceCollectionExtensions.cs b/LaserCatEyes.WCFListener/LaserCatEyesServiceCollectionExtensions.cs index f09cc11..299623f 100644 --- a/LaserCatEyes.WCFListener/LaserCatEyesServiceCollectionExtensions.cs +++ b/LaserCatEyes.WCFListener/LaserCatEyesServiceCollectionExtensions.cs @@ -1,35 +1,34 @@ using System; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; -using LaserCatEyes.DataServiceSdk.DotNetStandard; +using LaserCatEyes.DataServiceSdk; using LaserCatEyes.Domain; using LaserCatEyes.Domain.Models; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -namespace LaserCatEyes.WCFListener +namespace LaserCatEyes.WCFListener; + +public static class WCFListenerServiceCollectionExtensions { - public static class WCFListenerServiceCollectionExtensions + public static IServiceCollection AddLaserCatEyesWCFListener(this IServiceCollection services, string appKey) { - public static IServiceCollection AddLaserCatEyesWCFListener(this IServiceCollection services, string appKey) - { - services.TryAddSingleton(Options.Create(new LaserCatEyesOptions(appKey))); - return AddLaserCatEyesWCFListenerBase(services); - } + services.TryAddSingleton(Options.Create(new LaserCatEyesOptions(appKey))); + return AddLaserCatEyesWCFListenerBase(services); + } - public static IServiceCollection AddLaserCatEyesWCFListener(this IServiceCollection services, Action setupAction) - { - services.TryAddSingleton>(new ConfigureNamedOptions(setupAction.Method.Name, setupAction)); - return AddLaserCatEyesWCFListenerBase(services); - } + public static IServiceCollection AddLaserCatEyesWCFListener(this IServiceCollection services, Action setupAction) + { + services.TryAddSingleton>(new ConfigureNamedOptions(setupAction.Method.Name, setupAction)); + return AddLaserCatEyesWCFListenerBase(services); + } - private static IServiceCollection AddLaserCatEyesWCFListenerBase(IServiceCollection services) - { - services.TryAddSingleton(); - services.AddTransient(); - services.AddTransient(); - return services; - } + private static IServiceCollection AddLaserCatEyesWCFListenerBase(IServiceCollection services) + { + services.TryAddSingleton(); + services.AddTransient(); + services.AddTransient(); + return services; } } \ No newline at end of file diff --git a/LaserCatEyes.WCFListener/LoggingEndpointBehaviour.cs b/LaserCatEyes.WCFListener/LoggingEndpointBehaviour.cs index 3000ec9..330bf7f 100644 --- a/LaserCatEyes.WCFListener/LoggingEndpointBehaviour.cs +++ b/LaserCatEyes.WCFListener/LoggingEndpointBehaviour.cs @@ -3,32 +3,26 @@ using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; -namespace LaserCatEyes.WCFListener -{ - public class LaserCatEyesEndpointBehaviour : IEndpointBehavior - { - public LaserCatEyesEndpointBehaviour(IClientMessageInspector messageInspector) - { - MessageInspector = messageInspector ?? throw new ArgumentNullException(nameof(messageInspector)); - } +namespace LaserCatEyes.WCFListener; - private IClientMessageInspector MessageInspector { get; } +public class LaserCatEyesEndpointBehaviour(IClientMessageInspector messageInspector) : IEndpointBehavior +{ + private IClientMessageInspector MessageInspector { get; } = messageInspector ?? throw new ArgumentNullException(nameof(messageInspector)); - public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) - { - } + public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) + { + } - public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) - { - clientRuntime.ClientMessageInspectors.Add(MessageInspector); - } + public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) + { + clientRuntime.ClientMessageInspectors.Add(MessageInspector); + } - public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) - { - } + public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) + { + } - public void Validate(ServiceEndpoint endpoint) - { - } + public void Validate(ServiceEndpoint endpoint) + { } } \ No newline at end of file diff --git a/LaserCatEyes.WCFListener/PackageDataHelper.cs b/LaserCatEyes.WCFListener/PackageDataHelper.cs index 7fc70f3..2a1a691 100644 --- a/LaserCatEyes.WCFListener/PackageDataHelper.cs +++ b/LaserCatEyes.WCFListener/PackageDataHelper.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; @@ -9,63 +8,62 @@ using LaserCatEyes.Domain; using LaserCatEyes.Domain.Models; -namespace LaserCatEyes.WCFListener +namespace LaserCatEyes.WCFListener; + +public static class PackageDataHelper { - public static class PackageDataHelper + public static PackageData RequestPackageDataFromHttpRequestMessage(Guid id, ref Message request) { - public static PackageData RequestPackageDataFromHttpRequestMessage(Guid id, ref Message request) - { - using var buffer = request.CreateBufferedCopy(int.MaxValue); - var document = GetDocument(buffer.CreateMessage()); - request = buffer.CreateMessage(); + using var buffer = request.CreateBufferedCopy(int.MaxValue); + var document = GetDocument(buffer.CreateMessage()); + request = buffer.CreateMessage(); - return PackageData.CreateRequestPackage( - id, - request.Headers.Action, - MethodType.POST, - new List(), - document.OuterXml, - DateTime.UtcNow, - null, - null); - } + return PackageData.CreateRequestPackage( + id, + request.Headers.Action, + MethodType.POST, + [], + document.OuterXml, + DateTime.UtcNow, + null, + null); + } - public static PackageData ResponsePackageDataFromHttpResponseMessage(PackageData data, ref Message message) - { - var httpResponseMessageProperty = message.Properties.Values.OfType().FirstOrDefault(); - var getHttpResponseMessageMethod = typeof(HttpResponseMessageProperty).GetRuntimeMethod("get_HttpResponseMessage", Type.EmptyTypes); - var response = (HttpResponseMessage) getHttpResponseMessageMethod.Invoke(httpResponseMessageProperty, null); + public static PackageData ResponsePackageDataFromHttpResponseMessage(PackageData data, ref Message message) + { + var httpResponseMessageProperty = message.Properties.Values.OfType().FirstOrDefault(); + var getHttpResponseMessageMethod = typeof(HttpResponseMessageProperty).GetRuntimeMethod("get_HttpResponseMessage", Type.EmptyTypes); + var response = (HttpResponseMessage)getHttpResponseMessageMethod.Invoke(httpResponseMessageProperty, null); - using var buffer = message.CreateBufferedCopy(int.MaxValue); - var document = GetDocument(buffer.CreateMessage()); - message = buffer.CreateMessage(); + using var buffer = message.CreateBufferedCopy(int.MaxValue); + var document = GetDocument(buffer.CreateMessage()); + message = buffer.CreateMessage(); - data.RequestPackage.Url = response.RequestMessage.RequestUri.ToString(); - data.RequestPackage.Headers = response.RequestMessage.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(); - data.RequestPackage.MethodType = Utilities.HttpMethodStringToEnumConverter(response.RequestMessage.Method.Method); + data.RequestPackage.Url = response.RequestMessage.RequestUri.ToString(); + data.RequestPackage.HeaderCouples = response.RequestMessage.Headers.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(); + data.RequestPackage.MethodType = Utilities.HttpMethodStringToEnumConverter(response.RequestMessage.Method.Method); - data.ResponsePackage = PackageData.CreateResponsePackage( - data.Id, - (int) response.StatusCode, response.Headers.SelectMany(r => r.Value.Select(value => $"{r.Key}:{value}")).ToList(), - document.OuterXml, - DateTime.UtcNow).ResponsePackage; + data.ResponsePackage = PackageData.CreateResponsePackage( + data.Id, + (int)response.StatusCode, response.Headers.SelectMany(r => r.Value.Select(value => new HeaderCouple(r.Key, value))).ToList(), + document.OuterXml, + DateTime.UtcNow).ResponsePackage; - return data; - } + return data; + } - private static XmlDocument GetDocument(Message request) - { - var document = new XmlDocument(); - using var memoryStream = new MemoryStream(); + private static XmlDocument GetDocument(Message request) + { + XmlDocument document = new(); + using MemoryStream memoryStream = new(); - var writer = XmlWriter.Create(memoryStream); - request.WriteMessage(writer); - writer.Flush(); - memoryStream.Position = 0; + var writer = XmlWriter.Create(memoryStream); + request.WriteMessage(writer); + writer.Flush(); + memoryStream.Position = 0; - document.Load(memoryStream); + document.Load(memoryStream); - return document; - } + return document; } } \ No newline at end of file diff --git a/Sample/SampleDotNetCoreClientApp/Program.cs b/Sample/SampleDotNetCoreClientApp/Program.cs index 4aa2030..e0c52ec 100644 --- a/Sample/SampleDotNetCoreClientApp/Program.cs +++ b/Sample/SampleDotNetCoreClientApp/Program.cs @@ -9,103 +9,103 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -namespace SampleDotNetCoreClientApp +namespace SampleDotNetCoreClientApp; + +internal class Program { - internal class Program + private static async Task Main(string[] args) { - private static async Task Main(string[] args) + const string baseDomain = "https://localhost:44328"; + // const string baseDomain = "https://localhost:5001"; + + var serviceCollection = new ServiceCollection().AddLogging(); + + var builder = new ConfigurationBuilder() + .AddUserSecrets(); + IConfiguration configuration = builder.Build(); + serviceCollection.AddScoped(_ => configuration); + serviceCollection.AddHttpClient(); + serviceCollection.AddLaserCatEyesHttpClientListener(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + var simpleClass = serviceProvider.GetRequiredService(); + var clientX = serviceProvider.GetRequiredService(); + var client = clientX.CreateClient(); + await simpleClass.GetData(); + + var testDataFaker = new Faker() + .RuleFor(r => r.StringData, (faker, data) => faker.Hacker.Noun()) + .RuleFor(r => r.Id, f => Guid.NewGuid()) + .RuleFor(r => r.DoubleData, faker => faker.Random.Number()); + + //await client.GetAsync($"{baseDomain}/WeatherForecast/Error"); + //Console.WriteLine("."); + //Console.ReadLine(); + while (true) { - const string baseDomain = "https://localhost:44328"; - // const string baseDomain = "https://localhost:5001"; - - var serviceCollection = new ServiceCollection().AddLogging(); - - var builder = new ConfigurationBuilder() - .AddUserSecrets(); - IConfiguration configuration = builder.Build(); - serviceCollection.AddScoped(_ => configuration); - - serviceCollection.AddHttpClient(); - - serviceCollection.AddLaserCatEyesHttpClientListener(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - var simpleClass = serviceProvider.GetRequiredService(); - var clientX = serviceProvider.GetRequiredService(); - var client = clientX.CreateClient(); - await simpleClass.GetData(); + var fakeData = testDataFaker.Generate(); + await client.GetAsync($"{baseDomain}/WeatherForecast?" + + $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); + Console.Write("."); + Thread.Sleep(1000); - var testDataFaker = new Faker() - .RuleFor(r => r.StringData, (faker, data) => faker.Hacker.Noun()) - .RuleFor(r => r.Id, f => Guid.NewGuid()) - .RuleFor(r => r.DoubleData, faker => faker.Random.Number()); + fakeData = testDataFaker.Generate(); + fakeData.InnerClassData = testDataFaker.Generate(); - while (true) - { - var fakeData = testDataFaker.Generate(); - await client.GetAsync($"{baseDomain}/WeatherForecast?" + - $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); - Console.Write("."); - Thread.Sleep(1000); - fakeData = testDataFaker.Generate(); - fakeData.InnerClassData = testDataFaker.Generate(); + await client.PostAsync($"{baseDomain}/WeatherForecast", new StringContent(JsonSerializer.Serialize(fakeData), Encoding.UTF8, "application/json")); + Console.Write("."); + fakeData = testDataFaker.Generate(); + await client.GetAsync($"{baseDomain}/WeatherForecast?" + + $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); + Console.Write("."); + Thread.Sleep(1000); - await client.PostAsync($"{baseDomain}/WeatherForecast", new StringContent(JsonSerializer.Serialize(fakeData), Encoding.UTF8, "application/json")); - Console.Write("."); + fakeData = testDataFaker.Generate(); + fakeData.InnerClassData = testDataFaker.Generate(); - fakeData = testDataFaker.Generate(); - await client.GetAsync($"{baseDomain}/WeatherForecast?" + - $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); - Console.Write("."); - Thread.Sleep(1000); - fakeData = testDataFaker.Generate(); - fakeData.InnerClassData = testDataFaker.Generate(); + await client.PostAsync($"{baseDomain}/WeatherForecast", new StringContent(JsonSerializer.Serialize(fakeData), Encoding.UTF8, "application/json")); + Console.WriteLine("."); + Thread.Sleep(10000); + } + } + private class TestData + { + public Guid Id { get; set; } + public string StringData { get; set; } + public double DoubleData { get; set; } + public TestData InnerClassData { get; set; } + } - await client.PostAsync($"{baseDomain}/WeatherForecast", new StringContent(JsonSerializer.Serialize(fakeData), Encoding.UTF8, "application/json")); - Console.WriteLine("."); - Thread.Sleep(1000); - } - } + public class SimpleClass : ISimpleClass + { + private readonly HttpClient _httpClient; - private class TestData + public SimpleClass(HttpClient httpClient) { - public Guid Id { get; set; } - public string StringData { get; set; } - public double DoubleData { get; set; } - public TestData InnerClassData { get; set; } + _httpClient = httpClient; } - public class SimpleClass : ISimpleClass + public async Task GetData() { - private readonly HttpClient _httpClient; - - public SimpleClass(HttpClient httpClient) - { - _httpClient = httpClient; - } - - public async Task GetData() - { - const string baseDomain = "https://localhost:44328"; - - var testDataFaker = new Faker() - .RuleFor(r => r.StringData, (faker, data) => faker.Hacker.Noun()) - .RuleFor(r => r.Id, f => Guid.NewGuid()) - .RuleFor(r => r.DoubleData, faker => faker.Random.Number()); - - var fakeData = testDataFaker.Generate(); - await _httpClient.GetAsync($"{baseDomain}/WeatherForecast?" + - $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); - } - } + const string baseDomain = "https://localhost:44328"; - internal interface ISimpleClass - { - Task GetData(); + var testDataFaker = new Faker() + .RuleFor(r => r.StringData, (faker, data) => faker.Hacker.Noun()) + .RuleFor(r => r.Id, f => Guid.NewGuid()) + .RuleFor(r => r.DoubleData, faker => faker.Random.Number()); + + var fakeData = testDataFaker.Generate(); + await _httpClient.GetAsync($"{baseDomain}/WeatherForecast?" + + $"Id={fakeData.Id}&StringData={fakeData.StringData}&DoubleData={fakeData.DoubleData}"); } } + + internal interface ISimpleClass + { + Task GetData(); + } } \ No newline at end of file diff --git a/Sample/SampleDotNetCoreClientApp/SampleDotNetCoreClientApp.csproj b/Sample/SampleDotNetCoreClientApp/SampleDotNetCoreClientApp.csproj index 91b9039..638aa55 100644 --- a/Sample/SampleDotNetCoreClientApp/SampleDotNetCoreClientApp.csproj +++ b/Sample/SampleDotNetCoreClientApp/SampleDotNetCoreClientApp.csproj @@ -2,13 +2,13 @@ Exe - net6.0 + net8.0 550e8434-d2dc-4997-8cda-fe3c4e5a5e86 - - + + diff --git a/Sample/SampleNetServerApp/Controllers/WeatherForecastController.cs b/Sample/SampleNetServerApp/Controllers/WeatherForecastController.cs index 0c22fd6..962c980 100644 --- a/Sample/SampleNetServerApp/Controllers/WeatherForecastController.cs +++ b/Sample/SampleNetServerApp/Controllers/WeatherForecastController.cs @@ -4,48 +4,54 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; -namespace SampleNetServerApp.Controllers +namespace SampleNetServerApp.Controllers; + +[ApiController] +[Route("[controller]")] +public class WeatherForecastController : ControllerBase { - [ApiController] - [Route("[controller]")] - public class WeatherForecastController : ControllerBase + private static readonly string[] Summaries = new[] { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; - private readonly ILogger _logger; + private readonly ILogger _logger; - public WeatherForecastController(ILogger logger) - { - _logger = logger; - } + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } - [HttpGet] - public IEnumerable Get() - { - var rng = new Random(); - return Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = DateTime.Now.AddDays(index), - TemperatureC = rng.Next(-20, 55), - Summary = Summaries[rng.Next(Summaries.Length)] - }) - .ToArray(); - } + [HttpGet] + public IEnumerable Get() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }) + .ToArray(); + } - [HttpPost] - public IActionResult Post(TestData model) - { - var rng = new Random(); - if (rng.Next(1) % 2 == 0) - { - return BadRequest(); - } + [HttpGet("Error")] + public IEnumerable Error() + { + throw new Exception("Test"); + } - return Ok(model); + [HttpPost] + public IActionResult Post(TestData model) + { + var rng = new Random(); + + if (rng.Next(1) % 2 == 0) + { + return BadRequest(); } + + return Ok(model); } } \ No newline at end of file diff --git a/Sample/SampleNetServerApp/Program.cs b/Sample/SampleNetServerApp/Program.cs index fb7a312..1c435d2 100644 --- a/Sample/SampleNetServerApp/Program.cs +++ b/Sample/SampleNetServerApp/Program.cs @@ -1,19 +1,38 @@ -using Microsoft.AspNetCore.Hosting; +using LaserCatEyes.EndpointListener; +using LaserCatEyes.HttpClientListener; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.OpenApi.Models; -namespace SampleNetServerApp +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +if (builder.Environment.IsDevelopment()) +{ + builder.Configuration.AddUserSecrets(); + builder.Services.AddLaserCatEyesEndpointListener(); + builder.Services.AddLaserCatEyesHttpClientListener(); +} + +builder.Services.AddControllers(); +builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "SampleNetServerApp", Version = "v1" }); }); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) { - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } + app.UseLaserCatEyesEndpointListenerMiddleware(); + app.UseDeveloperExceptionPage(); + app.UseSwagger(); + app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SampleNetServerApp v1")); +} + +app.UseHttpsRedirection(); +app.UseRouting(); +app.UseAuthorization(); +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - public static IHostBuilder CreateHostBuilder(string[] args) - { - return Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); - } - } -} \ No newline at end of file +app.Run(); \ No newline at end of file diff --git a/Sample/SampleNetServerApp/SampleNetServerApp.csproj b/Sample/SampleNetServerApp/SampleNetServerApp.csproj index 036cdf4..e220297 100644 --- a/Sample/SampleNetServerApp/SampleNetServerApp.csproj +++ b/Sample/SampleNetServerApp/SampleNetServerApp.csproj @@ -1,12 +1,12 @@ - net6.0 + net8.0 996389f1-bb0b-4803-b991-ea410c2bb2b0 - + diff --git a/Sample/SampleNetServerApp/Startup.cs b/Sample/SampleNetServerApp/Startup.cs deleted file mode 100644 index 553d71a..0000000 --- a/Sample/SampleNetServerApp/Startup.cs +++ /dev/null @@ -1,57 +0,0 @@ -using LaserCatEyes.EndpointListener; -using LaserCatEyes.HttpClientListener; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.OpenApi.Models; - -namespace SampleNetServerApp -{ - public class Startup - { - private readonly IWebHostEnvironment _env; - - public Startup(IWebHostEnvironment env, IConfiguration configuration) - { - _env = env; - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - if (_env.IsDevelopment()) - { - services.AddLaserCatEyesEndpointListener(); - services.AddLaserCatEyesHttpClientListener(); - } - - services.AddControllers(); - services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "SampleNetServerApp", Version = "v1"}); }); - } - - // 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.UseLaserCatEyesEndpointListenerMiddleware(); - app.UseDeveloperExceptionPage(); - app.UseSwagger(); - app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SampleNetServerApp v1")); - } - - app.UseHttpsRedirection(); - - app.UseRouting(); - - app.UseAuthorization(); - - app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - } - } -} \ No newline at end of file diff --git a/Sample/SampleNetServerApp/WeatherForecast.cs b/Sample/SampleNetServerApp/WeatherForecast.cs index b3956df..9c392d2 100644 --- a/Sample/SampleNetServerApp/WeatherForecast.cs +++ b/Sample/SampleNetServerApp/WeatherForecast.cs @@ -1,23 +1,22 @@ using System; -namespace SampleNetServerApp +namespace SampleNetServerApp; + +public class WeatherForecast { - public class WeatherForecast - { - public DateTime Date { get; set; } + public DateTime Date { get; set; } - public int TemperatureC { get; set; } + public int TemperatureC { get; set; } - public int TemperatureF => 32 + (int) (TemperatureC / 0.5556); + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - public string Summary { get; set; } - } + public string Summary { get; set; } +} - public class TestData - { - public Guid Id { get; set; } - public string StringData { get; set; } - public double DoubleData { get; set; } - public TestData InnerClassData { get; set; } - } +public class TestData +{ + public Guid Id { get; set; } + public string StringData { get; set; } + public double DoubleData { get; set; } + public TestData InnerClassData { get; set; } } \ No newline at end of file diff --git a/SampleFunctionServerApp/local.settings.json b/SampleFunctionServerApp/local.settings.json deleted file mode 100644 index 64a872f..0000000 --- a/SampleFunctionServerApp/local.settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "IsEncrypted": false, - "Values": { - "AzureWebJobsStorage": "UseDevelopmentStorage=true", - "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" - } -} \ No newline at end of file