Why .NET 5.0 and not .NET Core 5.0? And, where is .NET (core) 4.0?

Note the point…

.NET 5.0 is the next major release of .NET Core following 3.1. We named this new release .NET 5.0 instead of .NET Core 4.0 for two reasons:

  • We skipped version numbers 4.x to avoid confusion with .NET Framework 4.x.
  • We dropped “Core” from the name to emphasize that this is the main implementation of .NET going forward. .NET 5.0 supports more types of apps and more platforms than .NET Core or .NET Framework.

ASP.NET Core 5.0 is based on .NET 5.0 but retains the name “Core” to avoid confusing it with ASP.NET MVC 5. Likewise, Entity Framework Core 5.0 retains the name “Core” to avoid confusing it with Entity Framework 5 and 6.

Ref: https://docs.microsoft.com/en-us/dotnet/core/dotnet-five

Strong Password Generator in C#

This code snippets will let you auto-generate strong passwords. Look for the password rules in the inline comments in code

001 using System;
002 using System.Collections.Generic;
003 using System.Linq;
004 using System.Security.Cryptography.X509Certificates;
005 using System.Text;
006 using System.Threading.Tasks;
007
008 namespace PwdGen
009 {
010     class Program
011     {
012         static void Main(string[] args)
013         {
014             //Console.WriteLine(GeneratePassword2(8, 15));
015             //Console.WriteLine(GeneratePassword(8, 15));
016             Console.ReadKey();
017         }
018
019         static string GeneratePassword2(int MinLengthint MaxLength)
020         {
021
022             string ValidChars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;<>|=.,_-~!?&%@#$£€°^*§()+[] ";
023             string SpecialChars "!@#$%^&*()";
024             
025             string pwd string.Empty;
026
027             do
028             {
029                 Random rnd = new Random(Guid.NewGuid().GetHashCode());
030                 pwd string.Join(string.Empty, Enumerable.Repeat(ValidCharsrnd.Next(MinLengthMaxLength 1)).Select(=> s[rnd.Next(s.Length)]).ToArray());
031                 Console.WriteLine(pwd);
032             } while (
033
034                 Regex.Match(pwd"[a-zA-Z]{3,}").Success || // Not more than 3 chars in sequence
035                 Regex.Match(pwd, @"(\w)\1{2,}").Success || //Same number should not repeat more than 2 times
036                 Regex.Match(pwd"[1-9]{3,}").Success ||    // Not more than 3 numbers in sequence
037                 !Regex.Match(pwd"[A-Z]").Success ||       // At least one upper case char
038                 !Regex.Match(pwd"[a-z]").Success ||       // At least one lower case char
039                 !Regex.Match(pwd"[1-9]").Success ||         // At least one number
040                 (pwd.ToArray().Where(=> SpecialChars.ToArray().Any(l2 => l2 == l)).Count() == 0// At least one pre defined special char
041                 );
042             
043             return pwd;
044         }
045
046         static string GeneratePassword(int MinLengthint MaxLength)
047         {
048             string ValidChars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;<>|=.,_-~!?&%@#$£€°^*§()+[] ";
049             string SpecialChars "!@#$%^&*()";
050             
051             string pwd string.Empty;
052
053             Random rnd = new Random(Guid.NewGuid().GetHashCode());
054             
055             bool NumExist false;
056             bool IsUpper false;
057             bool IsLower false;
058             bool IsSplChr false;
059             bool NoRepeat true;
060             bool NoSeq true;
061
062             while ((!NumExist || !IsUpper || !IsLower || !IsSplChr) && (NoRepeat || NoSeq) )
063             {
064                 NumExist false;
065                 IsUpper false;
066                 IsLower false;
067                 IsSplChr false;
068                 NoRepeat true;
069                 NoSeq true;
070                 
071                 pwd string.Join(string.Empty, Enumerable.Repeat(ValidCharsrnd.Next(MinLengthMaxLength 1)).Select(=> s[rnd.Next(s.Length)]).ToArray());
072                 for (int i 0pwd.Lengthi++)
073                 {
074                     // Contains at least 1 lower case letter and 1 upper case letter (all UTF-8), at least 1 number
075
076                     if (!NumExist)
077                     {
078                         NumExist = (char.IsDigit(pwd[i]) && true);
079                     }
080                     if (!IsUpper)
081                     {
082                         IsUpper = (char.IsUpper(pwd[i]) && true);
083                     }
084                     if (!IsLower)
085                     {
086                         IsLower = (char.IsLower(pwd[i]) && true);
087                     }
088
089                     // A predefined set of special chars must be present
090                     if (!IsSplChr)
091                     {
092                         IsSplChr = (SpecialChars.IndexOf(pwd[i]) >= 0);
093                     }
094
095
096                     // Not more than 2 identical characters in a row (e.g., 111 not allowed)
097                     if (pwd.Length && NoRepeat)
098                     {
099                         NoRepeat = !((pwd[i] == pwd[1]) && (pwd[i] == pwd[2]));
100                     }
101
102                     // Not any sequence of the English alphabet / numbers (above 3 letters)
103                     if (pwd.Length && NoSeq)
104                     {
105                         NoSeq = !((pwd[2] - pwd[1]) == (pwd[1] - pwd[i]));
106                     }
107                     Console.WriteLine(!NumExist +" "+ !IsUpper " " + !IsLower " " + !IsSplChr " " +  NoRepeat +NoSeq);
108                 }
109                 
110             }
111             
112             return pwd;
113
114         }
115     }
116 }
117

View in GitHub | Made with wp-showgithubfile plugin

Join two XML files using XSL Transformation

This blog demonstrates how you can JOIN (yes, like in SQL) two xml (datasets) to one using a common ID (relationship).

shop.xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='main.xsl'?>
<shop>
<product>
<id>100</id>
<title>hello</title>
</product>

<product>
<id>101</id>
<title>world</title>
</product>
<product>
<id>102</id>
<title>praveen</title>
</product>
</shop>

price.xml

<?xml version="1.0" encoding="UTF-8"?>
<shop>
<product>
<id>100</id>
<price>10.0</price>
</product>
<product>
<id>101</id>
<price>10.1</price>
</product>
<product>
<id>102</id>
<price>10.2</price>
</product>
<product>
<id>103</id>
<price>10.3</price>
</product>

</shop>

main.xsl


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:param name="fileName" select="'price.xml'" />

<xsl:variable name="updateItems" select="document($fileName)/shop/product" />

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
<xsl:copy-of select="$updateItems[id=current()/id]/price" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

Resulting XML, after transformation should look like:


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='main.xsl'?>
<shop>
<product>
<id>100</id>
<title>hello</title>
<price>10.0</price>
</product>
<product>
<id>101</id>
<title>world</title>
<price>10.1</price>
</product>
<product>
<id>102</id>
<title>praveen</title>
<price>10.2</price>
</product>
</shop>

Bonus code, if some .net developers want a transformation code:


XslTransform xslt = new XslTransform();
xslt.Load(@"D:\Websites\xmltest\main.xsl");
xslt.Transform(@"D:\Websites\xmltest\shop.xml", @"D:\Websites\xmltest\out.xml");
textBox1.Text = System.IO.File.ReadAllText(@"D:\Websites\xmltest\out.xml");

Send an Office365 SMTP mail in .NET/C#

Sending a mail using Office365 is no big deal. It is just similar to how you send a mail via any SMTP server. But you will have to mind the SMTP host, port number and remember to enable SSL in the code. Here goes the code snippet:


using (MailMessage message = new MailMessage())
{
message.From = new MailAddress("praveen@YourO365Domain.com");
message.To.Add("praveen@yourmail.com");
message.Subject = "test mail";
message.Body = "<h1>test</h1>";
message.IsBodyHtml = true;

SmtpClient client = new SmtpClient("outlook.office365.com", 587);

client.Credentials = new NetworkCredential("praveen@YourO365Domain.com", "passwordhere");
client.EnableSsl = true;
client.Send(message);
}