Walter 2024.1.22.746
Prefix ReservedSee the version list below for details.
dotnet add package Walter --version 2024.1.22.746
NuGet\Install-Package Walter -Version 2024.1.22.746
<PackageReference Include="Walter" Version="2024.1.22.746" />
paket add Walter --version 2024.1.22.746
#r "nuget: Walter, 2024.1.22.746"
// Install Walter as a Cake Addin #addin nuget:?package=Walter&version=2024.1.22.746 // Install Walter as a Cake Tool #tool nuget:?package=Walter&version=2024.1.22.746
WALTER
Introducing the WALTER Framework: Workable Algorithms for Location-aware Transmission, Encryption Response. Designed for modern developers, WALTER is a groundbreaking suite of NuGet packages crafted for excellence in .NET Standard 2.0, 2.1, Core 3.1, and .NET 6, 7, 8, as well as C++ environments. Emphasizing 100% AoT support and reflection-free operations, this framework is the epitome of performance and stability.
Whether you're tackling networking, encryption, or secure communication, WALTER offers unparalleled efficiency and precision in processing, making it an essential tool for developers who prioritize speed and memory management in their applications.
About this Nuget Package
This NuGet package contains helpful extension methods for any .NET project targeting anything from the Web to MAUI, Native Windows, Linux, or Mac. Even though this NuGet package is not intended for direct use, it does come with some handy features. You can download the cmpiled help file as well as see code samples in github
Ahead-Of-Time (AOT) Compilation Compliant
The NuGet package can be used with projects that are trimming and use AoT. However, Newtonsoft Json is not AoT compliant as it uses reflection; therefore, Newtonsoft extension methods are excluded from AoT support.
Json Extensions
We offer helpful extension methods for when you need to process Large JSON files and can't load the whole file in memory as well as exception free processing of json files, strings and streams using the IsValidJson<T>()
extension method
The JsonStreamReader<T>
class in the Walter
namespace is a powerful utility for deserializing JSON data from streams in .NET.
This class provides a seamless way to read JSON content instance by instance, handling exceptions gracefully,
and is compliant with various .NET versions including .NET Standard 2.0, 2.1, Core 3.1, and .NET 6, 7, 8. It's
designed to work efficiently.
Usage
The class is used for reading JSON data from a stream, with error handling mechanisms to capture any exceptions during the deserialization process.
Process a file row by row so you do not have to have the whole file in memory while processing it.
using var stream = File.OpenRead("AppData\\LinkedIn.json");
var sr = new Walter.JsonStreamReader<TCPIPNetwork>(stream,TCPIPNetworkJsonContext.Default.TCPIPNetwork);
int i=0;
var result= new List<TCPIPNetwork>();
await foreach (TCPIPNetwork item in sr.ReadAsync())
{
i++;
result.Add(item)
if(sr.Errors.Count>0)
{
_logger.LogError(sr.Errors[^1]
,"File line {line}, failed so entry {i} is skipped as it failed due to {error}"
,sr.Errors[^1].LineNumber,i+1,sr.Errors[^1].Message);
}
}
Process data from a webservice
The sample shows fetching a JSON stream from a web service streaming endpoint and processing the data row by row:
using System.Net.Http;
using System.IO;
using System.Threading.Tasks;
// ... other necessary namespaces
public async Task ProcessJsonDataFromWebServiceAsync()
{
using var httpClient = new HttpClient();
try
{
var response = await httpClient.GetStreamAsync("https://example.com/api/datastream");
var sr = new Walter.JsonStreamReader<TCPIPNetwork>(response, TCPIPNetworkJsonContext.Default.TCPIPNetwork);
int i = 0;
await foreach (TCPIPNetwork item in sr.ReadAsync())
{
i++;
// Process each item
// ...
if (sr.Errors.Count > 0)
{
_logger.LogError(sr.Errors[i - 1],
"File line {line}, failed so entry {i} is skipped as it failed due to {error}",
sr.Errors[i - 1].LineNumber, i, sr.Errors[i - 1].Message);
}
}
}
catch (HttpRequestException e)
{
_logger.LogError("Error fetching data from web service: {Message}", e.Message);
}
}
Read a file in one time and process all entries skip those that would fail
using var stream = File.OpenRead("TestData\\LinkedIn.json");
var sr = new Walter.JsonStreamReader<List<TCPIPNetwork>>(stream,TCPIPNetworkListJsonContext.Default.ListTCPIPNetwork);
var list = sr.Read();
foreach (var item in list)
{
...
}
String extension methods
This NuGet package includes a range of useful extension methods, enhancing functionality for JSON processing, conversions between hex and bytes, and handling SQL Server varbinary types. For additional examples and comprehensive documentation, you can visit the GitHub repository.
ToSqlBinaryString()
integration of Encrypted Data into T-SQL Command
The encryptedBytes.ToSqlBinaryString()
method is utilized to convert the byte array
(which is the result of the encryption process) into a SQL Server-friendly varbinary
format. This format is compatible with T-SQL syntax and is necessary for correctly
storing the encrypted data in the database.
The resulting string, prefixed with 0x
, represents the hexadecimal representation
of the encrypted data. This string is directly embedded into the T-SQL command,
allowing the encrypted data to be used in database operations such as INSERT or
UPDATE statements. In this way, the encrypted data can be stored securely in the
database while maintaining the ability to perform standard SQL operations on it.
var encryptedDataString = encryptedBytes.ToSqlBinaryString();
var tsql = @$"
DECLARE @EncryptedData VARBINARY(64) = {encryptedDataString};
...
INSERT INTO MyTable (EncryptedColumn) VALUES (@EncryptedData);
";
Secure encryption and decryption
Sample Test Cases for Understanding the Deterministic Encryption
Deterministic encryption is a method where identical plain text values are always encrypted into identical cipher text. This approach is particularly useful in scenarios where you need to:
- Store Sensitive Data on Third-party Servers: Especially relevant under GDPR compliance when using cloud services where you don't have control over the underlying hardware or database encryption mechanisms.
- Enable Grouping and Searching: Deterministic encryption allows for the encrypted data to be searchable and groupable, which is essential for performing database operations without decrypting the data, thus maintaining security and privacy.
Benefits and Considerations
- Data Privacy and Security: Ensures that sensitive data, such as personal information or proprietary corporate data, is stored securely, even in environments not directly controlled by your organization.
- Searchability and Operational Efficiency: Unlike other forms of encryption, deterministic encryption allows for efficient database operations such as indexing, searching, and grouping on encrypted data.
- Compliance with Regulations: Meets the requirements of regulations like GDPR, which mandate the protection of personal data, especially when processed or stored on external or cloud-based systems.
When to Use
- GDPR Compliance in Cloud-Based Storage: Ideal for scenarios requiring GDPR compliance while using cloud-based databases.
- Maintaining Operational Capabilities: When the ability to search or group data directly in the database is necessary for operational efficiency.
Important Considerations
- Not a One-Size-Fits-All Solution: Deterministic encryption is a tool among many in the security engineer's toolkit and should be used judiciously. It is not always the preferred method of encryption but can be effective for specific use cases.
- Secure Key Management: The security of deterministic encryption heavily relies on how the encryption keys are managed. It is crucial to ensure these keys are stored and handled securely, separate from the data they encrypt.
Deterministic encryption provides a balance between operational functionality and data security, making it a valuable option for specific use cases in cloud-based applications and services, particularly where GDPR compliance is a concern.
// Sample to demonstrate GDPR-compliant encryption of sensitive data using deterministic encryption
// for storage in a third-party hosted SQL server.
// Define the company name to be encrypted.
string companyName = "Undefined Corp";
// Create an instance of the symmetric encryption service with a secure password and salt.
// Note: In a production environment, securely manage the password and salt, avoiding hardcoded values.
var encryptionService = new Walter.Cypher.DeterministicEncryption(
password: "My $ectet Pa$w0rd",
salt: "123456789+*ç%&/"
);
// Encrypt the company name into a byte array.
byte[] encryptedBytes = encryptionService.Encrypt(companyName.ToBytes());
// Prepare the T-SQL command for data insertion, using the encrypted company name.
var tsql = @$"
DECLARE @UndefinedCorp VARBINARY(64) = {encryptedBytes.ToSqlBinaryString()};
DECLARE @checksum int = CHECKSUM(@UndefinedCorp);
// Check for the existence of the company and insert if not present.
if not exists(select * from [dbo].[Companies] where [CompanyName] = @UndefinedCorp and [cs_CompanyName] = @checksum)
BEGIN
INSERT [dbo].[Companies] ([CompanyName],[cs_CompanyName],[TrueUpDays],[AutoInvoice],[ApplicableLicenseExcempt])
Values(@UndefinedCorp, @checksum, -1, 0, 1);
END
";
// Execute the T-SQL command to store the encrypted data.
using var con = new SqlConnection(config.GetConnectionString("Billing"));
using var cmd = con.CreateCommand();
cmd.CommandText = tsql;
cmd.CommandType = System.Data.CommandType.Text;
con.Open();
cmd.ExecuteNonQuery();
Sample Test Cases for Understanding the Symmetric Encryption
We've included sample test cases in our codebase to demonstrate the functionality of the Symmetric Encryption process. These samples are crafted not just to test the code, but also to serve as practical examples for those looking to understand the encryption and decryption mechanisms in depth.
Why Test Cases?
- Hands-On Learning: By setting breakpoints and stepping through these tests, you can gain a hands-on understanding of how the encryption and decryption process works.
- Debugging and Inspection: It's an excellent opportunity to inspect the flow of data, observe how the encryption algorithm behaves, and understand how different components interact.
- Real-World Examples: These tests are more than theoretical scenarios; they represent real-world use cases, helping you relate the functionality to practical applications.
What's in the Sample?
- Encryption Consistency Test:
Encrypt_WithSamePassword_ShouldGenerateDifferentCiphertexts
ensures that the encryption process is secure and generates different ciphertexts for the same plaintext. - Cross-Instance Compatibility Test:
EncryptAndDecrypt_WithDifferentInstances_ShouldBeCompatible
confirms that the encrypted data by one instance can be decrypted by another, ensuring consistency across different instances.
How to Use the Sample
Understood, let's adjust the instructions to focus on using the NuGet package directly without the need for cloning a repository. Here's the revised section for your README.md:
markdown Copy code
How to Use the Sample
To effectively use and understand the Symmetric Encryption examples in the 'walter' NuGet package, follow these steps:
- Install the 'walter' NuGet Package: Start by adding the 'walter' package to your C# project. This package is essential as it contains the components you'll need for the encryption examples.
- Navigate to your Tests: Copy and past the test cases in the project's test project.
- Set Breakpoints: Place breakpoints at critical points in the tests.
- Debug and Step Through: Run the tests in debug mode and step through the code to observe how the encryption process is executed and validated.
We encourage you to explore these tests to deepen your understanding of symmetric encryption in a .NET environment.
[TestClass]
public class SymmetricEncryptionTests
{
// This test verifies that the same text encrypted with the same password generates different byte arrays.
// This is important to ensure that the encryption algorithm uses a unique initialization vector (IV) for each encryption,
// which enhances security by producing different ciphertexts for the same plaintext.
[TestMethod]
public void Encrypt_WithSamePassword_ShouldGenerateDifferentCiphertexts()
{
var secretText = "Hello World";
var encryptionInstance1 = new SymmetricEncryption("TestPassword");
var encryptionInstance2 = new SymmetricEncryption("TestPassword");
byte[] encryptedBytes1 = encryptionInstance1.Encrypt(Encoding.UTF8.GetBytes(secretText));
byte[] encryptedBytes2 = encryptionInstance2.Encrypt(Encoding.UTF8.GetBytes(secretText));
string ciphertext1 = Encoding.UTF8.GetString(encryptedBytes1);
string ciphertext2 = Encoding.UTF8.GetString(encryptedBytes2);
Assert.AreNotEqual(ciphertext1, ciphertext2, "Encrypted bytes should be different for the same input text.");
string decryptedText1 = Encoding.UTF8.GetString(encryptionInstance1.Decrypt(encryptedBytes1));
string decryptedText2 = Encoding.UTF8.GetString(encryptionInstance2.Decrypt(encryptedBytes2));
Assert.AreEqual(decryptedText1, decryptedText2, "Decrypted texts should match the original secret text.");
}
// This test ensures that text encrypted by one instance of the SymmetricEncryption class
// can be decrypted by another instance using the same password. This is crucial for verifying
// that the encryption and decryption processes are compatible and consistent across different instances.
[TestMethod]
public void EncryptAndDecrypt_WithDifferentInstances_ShouldBeCompatible()
{
var secretText = "Hello World";
var encryptionInstanceClient = new SymmetricEncryption("TestPassword");
var encryptionInstanceServer = new SymmetricEncryption("TestPassword");
string ciphertext = encryptionInstanceClient.EncryptString(secretText);
string decryptedText = encryptionInstanceServer.DecryptString(ciphertext);
Assert.AreEqual(secretText, decryptedText, "Decrypted text should match the original secret text.");
}
}
Extension methods
There are several extension methods that are usfull like ToBytes() and ToSqlBinaryString() as shown in the bellow code sample.
In the sample bellow we show how you could pre-populat database defaults in a GDPR compliant way where you can use the framweork to generate predefined standard values.
var corp = "Undefined Corp";
var cypher = new Walter.Cypher.SymmetricEncryption(password: "My $ectet Pa$w0rd"
, padding: System.Security.Cryptography.PaddingMode.PKCS7
);
byte[] bytes = cypher.Encrypt(corp.ToBytes());
var tsql = @$"
declare @UndefinedCorp Varbinary(64) = {bytes.ToSqlBinaryString()};
declare @checksum int = CHECKSUM(@UndefinedCorp);
if not exists(select * from [dbo].[Companies] where [CompanyName] =@UndefinedCorp and [cs_CompanyName]= @checksum)
BEGIN
INSERT [dbo].[Companies] ([CompanyName],[cs_CompanyName],[TrueUpDays],[AutoInvoice])
Values(@UndefinedCorp,@checksum,-1,0);
END
";
using var con = new SqlConnection(config.GetConnectionString("Billing"));
using var cmd = con.CreateCommand();
cmd.CommandText = tsql;
cmd.CommandType = System.Data.CommandType.Text;
con.Open();
cmd.ExecuteNonQuery();
AoT Exceptions Extension for .NET
The ExceptionsExtension
class is a powerful utility for .NET developers, enhancing exception handling with additional diagnostic information.
This extension provides methods to extract class names, method names, file names, and approximate line numbers from exceptions especially usefull in AoT.
Features
- ClassName: Retrieves the class name where the exception originated.
- MethodName: Obtains the method name that generated the exception.
- FileName: Gets the filename of the class that generated the exception.
- CodeLineNumber: Provides the actual or approximate line number where the exception was thrown.
Usage
Here is a examples of how to use the ExceptionsExtension
method:
try
{
_ = File.Open("A:\\doesNotExist.txt", FileMode.Open);
}
catch (Exception e)
{
//if the binary is AoT compiled the line number is this line
_logger.LogError(e, "{Class}.{method} (line {line}) failed with a {exception}:{message}",e.ClassName(), e.MethodName(), e.CodeLineNumber(),e.GetType().Name,e.Message);
}
Visit www.asp-waf.com for more information.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
-
.NETStandard 2.0
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
-
.NETStandard 2.1
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
-
net6.0
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
-
net7.0
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
-
net8.0
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.8.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on Walter:
Package | Downloads |
---|---|
Walter.Cypher
The cypher package for hashing data in a convenient and secure way as well as symmetric and asymmetric encryption methods.You can find On-line documentation at https://cypherapi.asp-waf.com/ as well as using the sample code found at https://github.com/ASP-WAF/Cypher |
|
Walter.Cypher.Native.Json
The cypher package targeting native json and securing data in transit via custom converters. |
|
Walter.Cypher.Newtonsoft.Json
The cypher package targeting newtonsoft json and securing data in transit via custome converters. |
|
Walter.Web.HtmlTools.HtmlMinify
This package allows you to minify HTML generated by MVC projects making the response generally smaller as well as less readable for those that want to copy or work. |
|
Walter.Extensions.Logging.MSTest
This package was created to assist in capturing and directing `ILogger` output to the MSTest output window. This is especially useful for debugging and tracing logs during test execution, ensuring that all log output is easily accessible in your test results. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
2024.11.20.705 | 0 | 11/21/2024 | |
2024.11.14.1710 | 79 | 11/14/2024 | |
2024.11.6.1222 | 862 | 11/6/2024 | |
2024.10.28.1605 | 482 | 10/28/2024 | |
2024.10.28.1335 | 433 | 10/28/2024 | |
2024.10.19.1530 | 419 | 10/20/2024 | |
2024.10.9.1059 | 153 | 10/9/2024 | |
2024.9.17.1417 | 1,341 | 9/17/2024 | |
2024.9.12.1923 | 564 | 9/12/2024 | |
2024.9.6.1352 | 580 | 9/7/2024 | |
2024.9.4.1300 | 205 | 9/4/2024 | |
2024.9.1.1128 | 583 | 9/1/2024 | |
2024.8.30.1347 | 110 | 8/31/2024 | |
2024.8.19.1111 | 1,119 | 8/19/2024 | |
2024.8.14.1042 | 987 | 8/14/2024 | |
2024.8.12.918 | 653 | 8/12/2024 | |
2024.8.5.1010 | 474 | 8/5/2024 | |
2024.7.26.543 | 648 | 7/26/2024 | |
2024.7.11.1604 | 534 | 7/11/2024 | |
2024.7.9.1504 | 559 | 7/9/2024 | |
2024.7.4.1422 | 126 | 7/4/2024 | |
2024.7.3.1001 | 927 | 7/3/2024 | |
2024.6.26.1407 | 1,010 | 6/28/2024 | |
2024.6.6.1320 | 438 | 6/8/2024 | |
2024.5.15.1634 | 385 | 5/15/2024 | |
2024.5.14.829 | 318 | 5/14/2024 | |
2024.5.13.1637 | 182 | 5/13/2024 | |
2024.5.8.1005 | 340 | 5/8/2024 | |
2024.4.4.2102 | 361 | 4/4/2024 | |
2024.4.4.1525 | 114 | 4/4/2024 | |
2024.3.26.1111 | 121 | 3/26/2024 | |
2024.3.26.939 | 275 | 3/26/2024 | |
2024.3.19.2310 | 289 | 3/19/2024 | |
2024.3.19.2136 | 115 | 3/19/2024 | |
2024.3.19.1207 | 113 | 3/19/2024 | |
2024.3.18.2046 | 126 | 3/18/2024 | |
2024.3.18.2030 | 120 | 3/18/2024 | |
2024.3.18.1707 | 118 | 3/18/2024 | |
2024.3.12.1022 | 302 | 3/12/2024 | |
2024.3.7.836 | 278 | 3/7/2024 | |
2024.3.6.1645 | 202 | 3/6/2024 | |
2024.3.3.842 | 309 | 3/3/2024 | |
2024.3.1.1143 | 239 | 3/1/2024 | |
2024.2.27.1029 | 188 | 2/27/2024 | |
2024.2.25.1737 | 117 | 2/25/2024 | |
2024.2.19.1557 | 137 | 2/21/2024 | |
2024.2.6.759 | 192 | 2/6/2024 | |
2024.2.5.1743 | 127 | 2/6/2024 | |
2024.2.1.1335 | 118 | 2/1/2024 | |
2024.1.22.746 | 151 | 1/22/2024 | |
2024.1.21.1514 | 118 | 1/21/2024 | |
2024.1.20.1130 | 112 | 1/20/2024 | |
2024.1.19.1524 | 125 | 1/19/2024 | |
2023.12.5.856 | 168 | 12/5/2023 | |
2023.10.12.1926 | 4,210 | 10/12/2023 | |
2023.9.14.812 | 1,755 | 9/14/2023 | |
2023.8.29.1040 | 9,598 | 8/29/2023 | |
2023.8.17.903 | 1,879 | 8/17/2023 | |
2023.8.9.1314 | 1,975 | 8/9/2023 | |
2023.8.2.750 | 2,035 | 8/2/2023 | |
2023.7.12.830 | 2,050 | 7/12/2023 | |
2023.7.5.1419 | 2,158 | 7/6/2023 | |
2023.6.14.1628 | 3,889 | 6/14/2023 | |
2023.5.30.1640 | 2,575 | 5/30/2023 | |
2023.5.4.1552 | 2,605 | 5/4/2023 | |
2023.4.12.1236 | 7,070 | 4/12/2023 | |
2023.3.14.1356 | 5,636 | 3/14/2023 | |
2023.3.1.810 | 3,345 | 3/1/2023 | |
2023.2.25.1185 | 1,055 | 2/25/2023 | |
2023.2.22.27 | 5,811 | 2/22/2023 | |
2023.2.15.1413 | 3,545 | 2/15/2023 | |
2023.2.11.1628 | 3,545 | 2/11/2023 | |
2023.1.11.534 | 3,873 | 1/11/2023 | |
2022.12.14.648 | 13,085 | 12/14/2022 | |
2022.11.27.1059 | 4,240 | 11/27/2022 | |
2022.11.21.338 | 4,318 | 11/21/2022 | |
2022.11.14.1819 | 4,545 | 11/14/2022 | |
2022.11.14.1533 | 783 | 11/14/2022 | |
2022.11.13.830 | 405 | 11/13/2022 | |
2022.10.31.740 | 8,389 | 11/1/2022 | |
2022.10.15.652 | 8,699 | 10/15/2022 | |
2022.10.1.810 | 10,674 | 10/1/2022 | |
2022.9.26.1444 | 11,306 | 9/26/2022 | |
2022.9.14.809 | 9,913 | 9/14/2022 | |
2022.9.8.1009 | 18,756 | 9/8/2022 | |
2022.8.20.1007 | 10,106 | 8/20/2022 | |
2022.8.1.1 | 10,371 | 7/31/2022 | |
2022.7.15.841 | 19,517 | 7/15/2022 | |
2022.7.1.1300 | 10,551 | 7/1/2022 | |
2022.6.21.647 | 10,429 | 6/21/2022 | |
2022.5.4.1010 | 37,493 | 5/4/2022 | |
2022.4.10.828 | 30,179 | 4/10/2022 | |
2022.3.26.1117 | 29,866 | 3/26/2022 | |
2022.2.11.931 | 51,565 | 2/17/2022 | |
2022.2.7.1634 | 535 | 2/17/2022 | |
2022.1.15.1312 | 21,549 | 1/17/2022 | |
2022.1.10.537 | 20,522 | 1/10/2022 | |
2022.1.7.1357 | 9,877 | 1/8/2022 | |
2021.12.28.1452 | 11,244 | 12/28/2021 | |
2021.12.15.911 | 10,595 | 12/16/2021 | |
2021.11.19.850 | 37,928 | 11/19/2021 | |
2021.11.11.1334 | 31,059 | 11/16/2021 | |
2021.11.8.2109 | 9,150 | 11/9/2021 | |
2021.11.8.1612 | 56,051 | 11/8/2021 | |
2021.10.13.1459 | 10,178 | 10/18/2021 | |
2021.10.11.1400 | 450 | 10/11/2021 | |
2021.10.9.1133 | 678 | 10/10/2021 | |
2021.9.26.1913 | 65,497 | 9/26/2021 | |
2021.9.17.1702 | 15,515 | 9/18/2021 | |
2021.8.30.1319 | 96,208 | 8/30/2021 | |
2021.8.14.1600 | 53,495 | 8/16/2021 | |
2021.8.14.829 | 5,829 | 8/14/2021 | |
2021.8.8.1612 | 18,621 | 8/8/2021 | |
2021.8.8.1138 | 646 | 8/8/2021 | |
2021.7.22.1033 | 63,749 | 7/23/2021 | |
2021.7.15.1547 | 10,094 | 7/15/2021 | |
2021.7.12.734 | 10,014 | 7/13/2021 | |
2021.6.26.1753 | 37,325 | 6/27/2021 | |
2021.6.23.734 | 19,387 | 6/24/2021 | |
2021.6.19.803 | 10,642 | 6/20/2021 | |
2021.6.11.1600 | 37,176 | 6/13/2021 | |
2021.6.9.1120 | 10,231 | 6/9/2021 | |
2021.6.7.1407 | 2,824 | 6/7/2021 | |
2021.5.31.1533 | 18,928 | 5/31/2021 | |
2021.5.28.1451 | 10,263 | 5/31/2021 | |
2021.5.25.1732 | 9,095 | 5/25/2021 | |
2021.5.12.929 | 28,112 | 5/12/2021 | |
2021.5.12.914 | 635 | 5/12/2021 | |
2021.5.12.637 | 7,584 | 5/12/2021 | |
2021.5.5.1901 | 33,234 | 5/6/2021 | |
2021.5.2.1617 | 9,874 | 5/4/2021 | |
2021.4.28.1503 | 19,027 | 4/28/2021 | |
2021.4.5.1653 | 63,288 | 4/5/2021 | |
2021.4.2.1918 | 460 | 4/2/2021 | |
2021.4.1.913 | 10,039 | 4/1/2021 | |
2021.3.31.1630 | 9,970 | 4/1/2021 | |
2021.3.17.606 | 10,546 | 3/18/2021 | |
2021.3.3.1259 | 724 | 3/3/2021 | |
2021.3.3.833 | 699 | 3/3/2021 | |
2021.3.1.1205 | 25,000 | 3/2/2021 | |
2021.3.1.1 | 17,250 | 2/27/2021 | |
2021.2.21.3 | 16,564 | 2/21/2021 | |
2021.2.19.3 | 9,404 | 2/20/2021 | |
2021.2.19.2 | 8,908 | 2/19/2021 | |
2021.2.16.1 | 24,035 | 2/16/2021 | |
2021.2.15.1 | 17,389 | 2/14/2021 | |
2021.2.10.1 | 38,369 | 2/10/2021 | |
2021.2.7.1 | 24,368 | 2/6/2021 | |
2020.12.27.1 | 17,053 | 12/27/2020 | |
2020.12.26.2 | 24,978 | 12/27/2020 | |
2020.12.24.2 | 752 | 12/26/2020 | |
2020.12.24.1 | 721 | 12/24/2020 | |
2020.12.18.1 | 9,246 | 12/19/2020 | |
2020.12.15.1 | 16,656 | 12/15/2020 | |
2020.12.14.5 | 12,488 | 12/14/2020 | |
2020.12.14.4 | 8,574 | 12/14/2020 | |
2020.12.14.3 | 8,429 | 12/14/2020 | |
2020.11.27.1 | 68,179 | 11/27/2020 | |
2020.11.25.1 | 13,443 | 11/25/2020 | |
2020.11.23.1 | 726 | 11/25/2020 | |
2020.11.22.2 | 8,962 | 11/23/2020 | |
2020.11.20.1 | 8,241 | 11/21/2020 | |
2020.11.19.3 | 8,311 | 11/19/2020 | |
2020.11.11.1 | 66,088 | 11/11/2020 | |
2020.10.9.5 | 129,554 | 10/9/2020 | |
2020.10.5.1 | 71,586 | 10/5/2020 | |
2020.10.4.1 | 782 | 10/4/2020 | |
2020.10.1.1 | 19,315 | 10/1/2020 | |
2020.9.29.9 | 13,281 | 9/29/2020 | |
2020.9.24.2 | 24,318 | 9/24/2020 | |
2020.9.11.1 | 50,615 | 9/11/2020 | |
2020.9.11 | 615 | 9/11/2020 | |
2020.9.8 | 18,015 | 9/8/2020 | |
2020.9.6.4 | 5,555 | 9/6/2020 | |
2020.9.6.3 | 786 | 9/6/2020 | |
2020.9.6.2 | 2,140 | 9/6/2020 | |
2020.9.3.1 | 15,380 | 9/3/2020 |
18 January 2024
- Update package to include other frameworks
- Add new License framework
- Add Cypher, DateTime mocking and other helper methods
- Add and update extension methods to be AOT compatible
- Make nuget package and enable trimming for consuming applications
- see on-line help at https://walter.vesnx.com/
14 November 2023
- Add support for .net 8
12 October 2023
- Build using SDK-7.0.402 and SDK-6.0.415
14 September 2023
- SDK 7.0.401/SDK 6.0.414
17 August 2023
- Add extension method ToCallStack to StackTrace.
09 August 2023
- Update to new .net release to compile with service packs
2 August 2023
- Build with updated frameworks
12 July 2023
- Update to SDK SP 6.0.412. and 7.0.306
14 June 2023
- Update due to SDK Update 7.0.304, and 6.0.410
31 May 2023
- Add SaveToDisk Method to Walter.TicketService class allowing framwork exceptions to be saved on disk.
6 May 2023
- Add extension method to Extension class allowing to write colored output to debug window of visual studio.
5 May 2023
- Update due to new Obfuscation tool update
12 April 2023
- Update to a new .net 7.0.5 SDK release
14 Mar 2023
- Update to new Netonsoft Jason release
22 Feb 2023
- Axel Imani Release (Go live)
15 February 2023
- Update to .net 6.0.406 and 7.0.3
11 January 2023
- update to 7.0.2, 6.0.13 SDK and build tools for 17.4.4
- An SP for .net 3.1 was not provided by Microsoft at this time, we recommend migration away from 3.1 asap
14 December 2022
- Update to .Net SDK 3.1.426, 6.0.404 and 7.0.101
7 December
- add support for net standard 2.1
27 November 2022
- Update NuGet packages
14 November
- Update Build Framework
13 November 2022
- Update NuGet Logging package
- Remove support for any thing lower than .Net 6.0
7 November 2022
- Add support for .net 7
31 October 2022
- Update to build with new SDK
1 October 2022
- New Build SDK
- Update code sign
14 September 2022
- Update to include new package 6.0.2 and Microsoft CVE-2022-38013
8 September 2022
- Update build using new tool-set
1 September 2022
- Update NuGet in alignment with fix on VS Build
20 August 2022
- update to SDK 6.0.400 / .Net 6.0.8 security patch
15 June 2022
- Update to support .net 6.0.7 and 3.1.27
04 May 2022
- Change Get file name from assembly to capture the hosting assembly if the assembly is embedded
10 April 2022
- Add storage field for AssemblyVersionInfo service indications
26 March 2022
- update to reflect new Framework dependencies
13 Jan 2022
- Add extension methods for reading json from streams
- Create method to use IEnumerator over JsonStreamReader.Read()
01 Jan 2022
- add time-out to Walter.Net.WebClient class
15 December 2021
- Update to SDK .NET 6.0.101, .NET 5.0.404 and .NET Core 3.1.416
3 December 2021
- Add extension method Base64Encode
9 November 2021
- Fix package dependency on vulnerable packages from Microsoft by upgrading vulnerable packages
8 November 2021
- Update to Microsoft packages 6.0.0, 5.0.403 and core 3.1.415
13 October 2021
- Update to .NET Core 3.1.20, .NET 5.0.11, .NET 6.0.0-rc.2
11 October 2021
- CodeSign the binaries as well as the NuGet package for executing in a trust-platform
- Add Accept header value to WafWebClient Get method
17 September 2021
- Update NuGet Packages to the new release
14 Aug 2021
- Update for .NET 6.0 SDK (v6.0.100-preview.7.21379.14)
- Update for .NET 5.0.400
- Update for .Net Standard 2.1.817
8 August 2021
- Update for .NET 6.0 SDK (v6.0.100-preview.6)
20 June 2021
- Include .Net 6.0 assembly
15 June 2021
- Update to .Net Core 3.1.17 and .Net 5.0.8
11 June 2021
- Update refereed NuGet packages
9 June 2021
- update to NET SDK 5.0.301 and 3.1.410
- Update NuGet Package references
7 June 2021
- Update WebClient to accept bad requests
- Update BOT browser signature
25 May 2021
- Update package reference external dependencies
05 May 2021
- Add support for .net standard 2.0
- Extend Assembly helper methods extract code sign certificate
31 March 2021
- Update package references
21 March 2021
- Update package references
- WalterWebClient will have public IP address property assigned on creation if connected to Internet and discovered
16 March 2021
- Add task extension
06 March 2021
- Update package references
01 March 2021
- Update Assembly extension
10 February 2021
- Refactoring
- Update package references
01 February 2021
- Update FileInfo extension methods
- Add Overload for AsShaHash method for getting hashes in a specific hash size
- Add RingBuffer class to repository
- Add IReadOnlyBuffer of UriAudit to WafWebClient.Requests property
- Update Package performance
25 January 2021
- Update extension methods
06 January 2021
- Discover NuGet package version and package URL in NugetPackageAttribute
05 January 2021
- extend AssemblyVersionInfo add Assembly GUID as well as public key signature
02 January 2021
- Updated license terms
30 December 2020
- Lazy logger add EventId
27 December 2020
- Remove empty list of none file locker detected or failed
25 December 2020
- Improve logging speed
24 December 2020
- Update NuGet Package reference
- Remove support for .Net48
18 December 2020
- Add SequentialGuid to NuGet package
15 December 2020
- Capture exception when server serving the request reports an error in the WafWebClient.Exception property
5 December 2020
- Update NuGet Package reference
20 November 2020
- Update NuGet Package reference
11 November 2020
1. Upgrade and support .net 5.0
04 October 2020
1. Update license terms
01 October 2020
1. Add documentation to public classes
29 September 2020
1. Add Lazy framework for ILogger instances allowing logging to run in a
non-obstructive way to the application thread and prevent logging issues
from taking down a system.
24 September 2020
1. Update logging
2. Update NuGet package
11 September 2020
1 update NuGet Package references
06 September 2020
1 Update AssemblyVersionInfo constructor to capture file info
26 August 2020
1 Add assembly helper methods allowing work-flows to test the age of the assembly vs the last action performed on it
12 August 2020
1 Update logging NuGet package dependency after .net 3.1.7 update
25 June 2020
1. Implement exception logging in ticket service
16 June 2020
1. Add String utility methods
13 June 2020
1. Add Guard arguments protection
2. Add parameter capturing for exception data in the ticket service
3. Add documentation items to classes in Walter name-space
11 June 2020 release
1. Add Ticket service for incident reporting when the TicketService.ExceptionReporting is set to true (default false)
10 June 2020 release
1. updated cashing avoiding double licensing requests
2. change callback signature