Archive for category Visual Studio .Net
Intercept values using Microsoft Moles
Posted by suddenelfilio in .net, Programming, Visual Studio .Net on 05/07/2011
Recently I needed to test some code in the most untestable codebase I’ve ever seen. Problem I was experiencing was that the value I needed to test was never exposedm but I knew what happened in the code. So I used Microsoft Moles to capture a value that was calculated in the method but never exposed. Below I’ll demonstrate the technique using a sample.
Let’s start with some code that is located in an external library:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SomeExternalLibrary
{
public class Utilities
{
public bool FormatStringContainsUpperCases(string template, params object[] arguments)
{
var formattedString = GetFormattedText(template,arguments);
return formattedString.ToLower() != formattedString;
}
public string GetFormattedText(string t, params object[] a)
{
return string.Format(t, a);
}
}
}
As you can see in the (useless) piece of code above we have a function that will format a string using a template and arguments and then evaluate if the formatted string contains uppercases. Now let’s say in a test we want to be sure that the formatted string is as we expect. We need a way to get the formatted result in the method FormatStringContainsUpperCases. This can be done using Microsoft Moles because we can create a mole library of the SomeExternalLibrary.dll which allows us to stub the Utilities class.
Once the Moles library is created we can start writing the Test code. Below you can see the entire test class:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SomeExternalLibrary;
using SomeExternalLibrary.Moles;
namespace SomeTestProject
{
[TestClass]
public class UnitTest1
{
[TestMethod]
[HostType("Moles")]
public void TestUtilities()
{
var inputTemplate = "this is the {0}";
var expectedFormattedString = "this is the Template";
var formattedString = "";
var classUnderTest = new Utilities();
MUtilities.AllInstances.GetFormattedTextStringObjectArray = (s, template, arguments) =>
{
MUtilities.AllInstances.GetFormattedTextStringObjectArray = null;
formattedString = classUnderTest.GetFormattedText(template, arguments);
return formattedString;
};
Assert.IsTrue(classUnderTest.FormatStringContainsUpperCases(inputTemplate, "Template"));
Assert.AreEqual(expectedFormattedString, formattedString);
}
}
}
In the test above we know that in the FormatStringContainsUpperCases method the GetFormattedString method is called. We setup interception using the MUtilities stub and attach a delegate to the GetFormattedString method for all instances of the Utilities class.
Next we remove the delegate we have just attached. If you do not do this the next line of code will cause a StackOverflowException since the code will get in an endless loop calling itself over and over.
MUtilities.AllInstances.GetFormattedTextStringObjectArray = null;
After removing the delegate we can call the original method GetFormattedString on the original class Utilities. This will then return the same result as it would when called in the FormatStringContainsUpperCases method. This result we can store in variable. The last step is to return variable so the calling code can finish correctly.
So to intercept a call you:
- Attach a delegate that will handle the interception.
- In the delegate body remove the interception delegate to prevent a StackOverflowException
- Call the original method and store the result in a variable
- Return the variable so the calling code can execute as if it would without the interception.
How to get the week number for a date in C#
Posted by suddenelfilio in .net, OS, Programming, Visual Studio .Net, Windows on 07/10/2010
Today I needed to know which week of the year a certain day was in. My first instinct was DateTime.Now.Week but it seems there is no Week property on a DateTime instance. So I started looking for a way to get the week number. As it turns out the CultureInfo class will get you where you want to go using the Calendar property.
I updated my extensions library (How to get the mime type of a file using the name of a file in C# and PART 2: How to get the mime type of a file using the name of a file in C# ) to add an extension method called WeekNumber for a DateTime instance here is the code:
public static class DateTimeExtensions
{
public static int WeekNumber(this System.DateTime value)
{
return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(value, CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday);
}
}
You can download my updated extension library here : Suddenelfilio.ExtensionMethods.zip
Downloaded 204 times
How to calculate password hash in C# for Jira users?
Posted by suddenelfilio in .net, Visual Studio .Net on 01/09/2010
While I’m working on migrating our current issue tracking system to the new Jira instance I needed to manually create new users in Jira’s database. The users are stored in the userbase table, but when you take a look you’ll see that the password is not stored instead there is a column called “PASSWORD_HASH” which contains the password in a hashed form. Since Jira uses the OSUser package from OpenSymphony you can go and look in the code.
The code that Jira uses to create the password hash is the following in Java:
private String createHash(String original) {
byte[] digested = PasswordDigester.digest(original.getBytes());
byte[] encoded = Base64.encode(digested);
return new String(encoded);
}
Now here you a digest being generated from the original value. Well this is a SHA-1/512 hash which is then converted to a Base64 representation and that’s all!
Okay here is how you can do this in C#:
using System;
using System.Text;
using System.Security.Cryptography;
public sealed class JiraPasswordHasher
{
public static string createHash(string original)
{
SHA512 shaM = new SHA512Managed();
var result = shaM.ComputeHash(System.Text.Encoding.ASCII.GetBytes(original));
return Convert.ToBase64String(result);
}
}
Have fun!
PART 2: How to get the mime type of a file using the name of a file in C#
Posted by suddenelfilio in Visual Studio .Net on 31/08/2010
Following up on a comment that was posted in my previous post I updated my library to first look in a hard coded list of extensions to see if I can find a corresponding mime type. I must admit that I got a bit inspired by the article Getting MIME types from extension by Pieter Joost van de Sande. I did however updated it to be more .net 4.0 by using the new Lazy<> which lets you do lazy loading. I also replaced the HashTable by a SortedDictionary<string,string>
So the code I used to look up the mime type has changed to this:
string fileExtension = System.IO.Path.GetExtension(fileName).ToLower();
var valueInTable = MimeTypeTable.MimeTypes.Value[fileExtension];
if (valueInTable != null)
return valueInTable as string;
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fileExtension);
if (rk != null && rk.GetValue("Content Type") != null)
return rk.GetValue("Content Type").ToString();
return null;
As you can see I now do a lookup in the MimeTypeTable and if I have no result only then I’ll go into the registry to try having better luck there. Here is the implementation of the MimeTypeTable class (beware it’s quite long) also the download of the new library is at the end of this post:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Suddenelfilio.ExtensionMethods.IO
{
internal sealed class MimeTypeTable
{
internal static Lazy<SortedDictionary<string, string>> MimeTypes
{
get
{
return new Lazy<SortedDictionary<string,string>>(() => LoadTable(), true);
}
}
private static SortedDictionary<string, string> LoadTable()
{
SortedDictionary<string, string> types = new SortedDictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
types.Add(".3dm", "x-world/x-3dmf");
types.Add(".3dmf", "x-world/x-3dmf");
types.Add(".aab", "application/x-authorware-bin");
types.Add(".aam", "application/x-authorware-map");
types.Add(".aas", "application/x-authorware-seg");
types.Add(".abc", "text/vnd.abc");
types.Add(".acgi", "text/html");
types.Add(".afl", "video/animaflex");
types.Add(".ai", "application/postscript");
types.Add(".aif", "audio/aiff");
types.Add(".aifc", "audio/aiff");
types.Add(".aiff", "audio/aiff");
types.Add(".aim", "application/x-aim");
types.Add(".aip", "text/x-audiosoft-intra");
types.Add(".ani", "application/x-navi-animation");
types.Add(".aos", "application/x-nokia-9000-communicator-add-on-software");
types.Add(".aps", "application/mime");
types.Add(".art", "image/x-jg");
types.Add(".asf", "video/x-ms-asf");
types.Add(".asm", "text/x-asm");
types.Add(".asp", "text/asp");
types.Add(".asx", "application/x-mplayer2");
types.Add(".au", "audio/x-au");
types.Add(".avi", "video/avi");
types.Add(".avs", "video/avs-video");
types.Add(".bcpio", "application/x-bcpio");
types.Add(".bm", "image/bmp");
types.Add(".bmp", "image/bmp");
types.Add(".boo", "application/book");
types.Add(".book", "application/book");
types.Add(".boz", "application/x-bzip2");
types.Add(".bsh", "application/x-bsh");
types.Add(".bz", "application/x-bzip");
types.Add(".bz2", "application/x-bzip2");
types.Add(".c", "text/plain");
types.Add(".c++", "text/plain");
types.Add(".cat", "application/vnd.ms-pki.seccat");
types.Add(".cc", "text/plain");
types.Add(".ccad", "application/clariscad");
types.Add(".cco", "application/x-cocoa");
types.Add(".cdf", "application/cdf");
types.Add(".cer", "application/pkix-cert");
types.Add(".cha", "application/x-chat");
types.Add(".chat", "application/x-chat");
types.Add(".class", "application/java");
types.Add(".conf", "text/plain");
types.Add(".cpio", "application/x-cpio");
types.Add(".cpp", "text/plain");
types.Add(".cpt", "application/x-cpt");
types.Add(".crl", "application/pkix-crl");
types.Add(".crt", "application/pkix-cert");
types.Add(".csh", "application/x-csh");
types.Add(".css", "text/css");
types.Add(".cxx", "text/plain");
types.Add(".dcr", "application/x-director");
types.Add(".deepv", "application/x-deepv");
types.Add(".def", "text/plain");
types.Add(".der", "application/x-x509-ca-cert");
types.Add(".dif", "video/x-dv");
types.Add(".dir", "application/x-director");
types.Add(".dl", "video/dl");
types.Add(".doc", "application/msword");
types.Add(".dot", "application/msword");
types.Add(".dp", "application/commonground");
types.Add(".drw", "application/drafting");
types.Add(".dv", "video/x-dv");
types.Add(".dvi", "application/x-dvi");
types.Add(".dwf", "drawing/x-dwf (old)");
types.Add(".dwg", "application/acad");
types.Add(".dxf", "application/dxf");
types.Add(".dxr", "application/x-director");
types.Add(".el", "text/x-script.elisp");
types.Add(".elc", "application/x-elc");
types.Add(".eps", "application/postscript");
types.Add(".es", "application/x-esrehber");
types.Add(".etx", "text/x-setext");
types.Add(".evy", "application/envoy");
types.Add(".f", "text/plain");
types.Add(".f77", "text/plain");
types.Add(".f90", "text/plain");
types.Add(".fdf", "application/vnd.fdf");
types.Add(".fif", "image/fif");
types.Add(".fli", "video/fli");
types.Add(".flo", "image/florian");
types.Add(".flx", "text/vnd.fmi.flexstor");
types.Add(".fmf", "video/x-atomic3d-feature");
types.Add(".for", "text/plain");
types.Add(".fpx", "image/vnd.fpx");
types.Add(".frl", "application/freeloader");
types.Add(".funk", "audio/make");
types.Add(".g", "text/plain");
types.Add(".g3", "image/g3fax");
types.Add(".gif", "image/gif");
types.Add(".gl", "video/gl");
types.Add(".gsd", "audio/x-gsm");
types.Add(".gsm", "audio/x-gsm");
types.Add(".gsp", "application/x-gsp");
types.Add(".gss", "application/x-gss");
types.Add(".gtar", "application/x-gtar");
types.Add(".gz", "application/x-gzip");
types.Add(".gzip", "application/x-gzip");
types.Add(".h", "text/plain");
types.Add(".hdf", "application/x-hdf");
types.Add(".help", "application/x-helpfile");
types.Add(".hgl", "application/vnd.hp-HPGL");
types.Add(".hh", "text/plain");
types.Add(".hlb", "text/x-script");
types.Add(".hlp", "application/x-helpfile");
types.Add(".hpg", "application/vnd.hp-HPGL");
types.Add(".hpgl", "application/vnd.hp-HPGL");
types.Add(".hqx", "application/binhex");
types.Add(".hta", "application/hta");
types.Add(".htc", "text/x-component");
types.Add(".htm", "text/html");
types.Add(".html", "text/html");
types.Add(".htmls", "text/html");
types.Add(".htt", "text/webviewhtml");
types.Add(".htx", "text/html");
types.Add(".ice", "x-conference/x-cooltalk");
types.Add(".ico", "image/x-icon");
types.Add(".idc", "text/plain");
types.Add(".ief", "image/ief");
types.Add(".iefs", "image/ief");
types.Add(".iges", "application/iges");
types.Add(".igs", "application/iges");
types.Add(".ima", "application/x-ima");
types.Add(".imap", "application/x-httpd-imap");
types.Add(".inf", "application/inf");
types.Add(".ins", "application/x-internett-signup");
types.Add(".ip", "application/x-ip2");
types.Add(".isu", "video/x-isvideo");
types.Add(".it", "audio/it");
types.Add(".iv", "application/x-inventor");
types.Add(".ivr", "i-world/i-vrml");
types.Add(".ivy", "application/x-livescreen");
types.Add(".jam", "audio/x-jam");
types.Add(".jav", "text/plain");
types.Add(".java", "text/plain");
types.Add(".jcm", "application/x-java-commerce");
types.Add(".jfif", "image/jpeg");
types.Add(".jfif-tbnl", "image/jpeg");
types.Add(".jpe", "image/jpeg");
types.Add(".jpeg", "image/jpeg");
types.Add(".jpg", "image/jpeg");
types.Add(".jps", "image/x-jps");
types.Add(".js", "application/x-javascript");
types.Add(".jut", "image/jutvision");
types.Add(".kar", "audio/midi");
types.Add(".ksh", "text/x-script.ksh");
types.Add(".la", "audio/nspaudio");
types.Add(".lam", "audio/x-liveaudio");
types.Add(".latex", "application/x-latex");
types.Add(".list", "text/plain");
types.Add(".lma", "audio/nspaudio");
types.Add(".log", "text/plain");
types.Add(".lsp", "application/x-lisp");
types.Add(".lst", "text/plain");
types.Add(".lsx", "text/x-la-asf");
types.Add(".ltx", "application/x-latex");
types.Add(".m", "text/plain");
types.Add(".m1v", "video/mpeg");
types.Add(".m2a", "audio/mpeg");
types.Add(".m2v", "video/mpeg");
types.Add(".m3u", "audio/x-mpequrl");
types.Add(".man", "application/x-troff-man");
types.Add(".map", "application/x-navimap");
types.Add(".mar", "text/plain");
types.Add(".mbd", "application/mbedlet");
types.Add(".mc$", "application/x-magic-cap-package-1.0");
types.Add(".mcd", "application/mcad");
types.Add(".mcf", "image/vasa");
types.Add(".mcp", "application/netmc");
types.Add(".me", "application/x-troff-me");
types.Add(".mht", "message/rfc822");
types.Add(".mhtml", "message/rfc822");
types.Add(".mid", "audio/midi");
types.Add(".midi", "audio/midi");
types.Add(".mif", "application/x-mif");
types.Add(".mime", "message/rfc822");
types.Add(".mjf", "audio/x-vnd.AudioExplosion.MjuiceMediaFile");
types.Add(".mjpg", "video/x-motion-jpeg");
types.Add(".mm", "application/base64");
types.Add(".mme", "application/base64");
types.Add(".mod", "audio/mod");
types.Add(".moov", "video/quicktime");
types.Add(".mov", "video/quicktime");
types.Add(".movie", "video/x-sgi-movie");
types.Add(".mp2", "video/mpeg");
types.Add(".mp3", "audio/mpeg3");
types.Add(".mpa", "audio/mpeg");
types.Add(".mpc", "application/x-project");
types.Add(".mpe", "video/mpeg");
types.Add(".mpeg", "video/mpeg");
types.Add(".mpg", "video/mpeg");
types.Add(".mpga", "audio/mpeg");
types.Add(".mpp", "application/vnd.ms-project");
types.Add(".mpt", "application/x-project");
types.Add(".mpv", "application/x-project");
types.Add(".mpx", "application/x-project");
types.Add(".mrc", "application/marc");
types.Add(".ms", "application/x-troff-ms");
types.Add(".mv", "video/x-sgi-movie");
types.Add(".my", "audio/make");
types.Add(".mzz", "application/x-vnd.AudioExplosion.mzz");
types.Add(".nap", "image/naplps");
types.Add(".naplps", "image/naplps");
types.Add(".nc", "application/x-netcdf");
types.Add(".ncm", "application/vnd.nokia.configuration-message");
types.Add(".nif", "image/x-niff");
types.Add(".niff", "image/x-niff");
types.Add(".nix", "application/x-mix-transfer");
types.Add(".nsc", "application/x-conference");
types.Add(".nvd", "application/x-navidoc");
types.Add(".oda", "application/oda");
types.Add(".omc", "application/x-omc");
types.Add(".omcd", "application/x-omcdatamaker");
types.Add(".omcr", "application/x-omcregerator");
types.Add(".p", "text/x-pascal");
types.Add(".p10", "application/pkcs10");
types.Add(".p12", "application/pkcs-12");
types.Add(".p7a", "application/x-pkcs7-signature");
types.Add(".p7c", "application/pkcs7-mime");
types.Add(".p7m", "application/pkcs7-mime");
types.Add(".p7r", "application/x-pkcs7-certreqresp");
types.Add(".p7s", "application/pkcs7-signature");
types.Add(".part", "application/pro_eng");
types.Add(".pas", "text/pascal");
types.Add(".pbm", "image/x-portable-bitmap");
types.Add(".pcl", "application/x-pcl");
types.Add(".pct", "image/x-pict");
types.Add(".pcx", "image/x-pcx");
types.Add(".pdb", "chemical/x-pdb");
types.Add(".pdf", "application/pdf");
types.Add(".pfunk", "audio/make");
types.Add(".pgm", "image/x-portable-graymap");
types.Add(".pic", "image/pict");
types.Add(".pict", "image/pict");
types.Add(".pkg", "application/x-newton-compatible-pkg");
types.Add(".pko", "application/vnd.ms-pki.pko");
types.Add(".pl", "text/plain");
types.Add(".plx", "application/x-PiXCLscript");
types.Add(".pm", "image/x-xpixmap");
types.Add(".pm4", "application/x-pagemaker");
types.Add(".pm5", "application/x-pagemaker");
types.Add(".png", "image/png");
types.Add(".pnm", "application/x-portable-anymap");
types.Add(".pot", "application/mspowerpoint");
types.Add(".pov", "model/x-pov");
types.Add(".ppa", "application/vnd.ms-powerpoint");
types.Add(".ppm", "image/x-portable-pixmap");
types.Add(".pps", "application/mspowerpoint");
types.Add(".ppt", "application/mspowerpoint");
types.Add(".ppz", "application/mspowerpoint");
types.Add(".pre", "application/x-freelance");
types.Add(".prt", "application/pro_eng");
types.Add(".ps", "application/postscript");
types.Add(".pvu", "paleovu/x-pv");
types.Add(".pwz", "application/vnd.ms-powerpoint");
types.Add(".py", "text/x-script.phyton");
types.Add(".pyc", "applicaiton/x-bytecode.python");
types.Add(".qcp", "audio/vnd.qcelp");
types.Add(".qd3", "x-world/x-3dmf");
types.Add(".qd3d", "x-world/x-3dmf");
types.Add(".qif", "image/x-quicktime");
types.Add(".qt", "video/quicktime");
types.Add(".qtc", "video/x-qtc");
types.Add(".qti", "image/x-quicktime");
types.Add(".qtif", "image/x-quicktime");
types.Add(".ra", "audio/x-pn-realaudio");
types.Add(".ram", "audio/x-pn-realaudio");
types.Add(".ras", "application/x-cmu-raster");
types.Add(".rast", "image/cmu-raster");
types.Add(".rexx", "text/x-script.rexx");
types.Add(".rf", "image/vnd.rn-realflash");
types.Add(".rgb", "image/x-rgb");
types.Add(".rm", "application/vnd.rn-realmedia");
types.Add(".rmi", "audio/mid");
types.Add(".rmm", "audio/x-pn-realaudio");
types.Add(".rmp", "audio/x-pn-realaudio");
types.Add(".rng", "application/ringing-tones");
types.Add(".rnx", "application/vnd.rn-realplayer");
types.Add(".roff", "application/x-troff");
types.Add(".rp", "image/vnd.rn-realpix");
types.Add(".rpm", "audio/x-pn-realaudio-plugin");
types.Add(".rss", "text/xml");
types.Add(".rt", "text/richtext");
types.Add(".rtf", "text/richtext");
types.Add(".rtx", "text/richtext");
types.Add(".rv", "video/vnd.rn-realvideo");
types.Add(".s", "text/x-asm");
types.Add(".s3m", "audio/s3m");
types.Add(".sbk", "application/x-tbook");
types.Add(".scm", "application/x-lotusscreencam");
types.Add(".sdml", "text/plain");
types.Add(".sdp", "application/sdp");
types.Add(".sdr", "application/sounder");
types.Add(".sea", "application/sea");
types.Add(".set", "application/set");
types.Add(".sgm", "text/sgml");
types.Add(".sgml", "text/sgml");
types.Add(".sh", "text/x-script.sh");
types.Add(".shar", "application/x-bsh");
types.Add(".shtml", "text/html");
types.Add(".sid", "audio/x-psid");
types.Add(".sit", "application/x-sit");
types.Add(".skd", "application/x-koan");
types.Add(".skm", "application/x-koan");
types.Add(".skp", "application/x-koan");
types.Add(".skt", "application/x-koan");
types.Add(".sl", "application/x-seelogo");
types.Add(".smi", "application/smil");
types.Add(".smil", "application/smil");
types.Add(".snd", "audio/basic");
types.Add(".sol", "application/solids");
types.Add(".spc", "application/x-pkcs7-certificates");
types.Add(".spl", "application/futuresplash");
types.Add(".spr", "application/x-sprite");
types.Add(".sprite", "application/x-sprite");
types.Add(".src", "application/x-wais-source");
types.Add(".ssi", "text/x-server-parsed-html");
types.Add(".ssm", "application/streamingmedia");
types.Add(".sst", "application/vnd.ms-pki.certstore");
types.Add(".step", "application/step");
types.Add(".stl", "application/sla");
types.Add(".stp", "application/step");
types.Add(".sv4cpio", "application/x-sv4cpio");
types.Add(".sv4crc", "application/x-sv4crc");
types.Add(".svf", "image/x-dwg");
types.Add(".svr", "application/x-world");
types.Add(".swf", "application/x-shockwave-flash");
types.Add(".t", "application/x-troff");
types.Add(".talk", "text/x-speech");
types.Add(".tar", "application/x-tar");
types.Add(".tbk", "application/toolbook");
types.Add(".tcl", "text/x-script.tcl");
types.Add(".tcsh", "text/x-script.tcsh");
types.Add(".tex", "application/x-tex");
types.Add(".texi", "application/x-texinfo");
types.Add(".texinfo", "application/x-texinfo");
types.Add(".text", "text/plain");
types.Add(".tgz", "application/x-compressed");
types.Add(".tif", "image/tiff");
types.Add(".tiff", "image/tiff");
types.Add(".tr", "application/x-troff");
types.Add(".tsi", "audio/tsp-audio");
types.Add(".tsp", "audio/tsplayer");
types.Add(".tsv", "text/tab-separated-values");
types.Add(".turbot", "image/florian");
types.Add(".txt", "text/plain");
types.Add(".uil", "text/x-uil");
types.Add(".uni", "text/uri-list");
types.Add(".unis", "text/uri-list");
types.Add(".unv", "application/i-deas");
types.Add(".uri", "text/uri-list");
types.Add(".uris", "text/uri-list");
types.Add(".ustar", "multipart/x-ustar");
types.Add(".uu", "text/x-uuencode");
types.Add(".uue", "text/x-uuencode");
types.Add(".vcd", "application/x-cdlink");
types.Add(".vcs", "text/x-vCalendar");
types.Add(".vda", "application/vda");
types.Add(".vdo", "video/vdo");
types.Add(".vew", "application/groupwise");
types.Add(".viv", "video/vivo");
types.Add(".vivo", "video/vivo");
types.Add(".vmd", "application/vocaltec-media-desc");
types.Add(".vmf", "application/vocaltec-media-file");
types.Add(".voc", "audio/voc");
types.Add(".vos", "video/vosaic");
types.Add(".vox", "audio/voxware");
types.Add(".vqe", "audio/x-twinvq-plugin");
types.Add(".vqf", "audio/x-twinvq");
types.Add(".vql", "audio/x-twinvq-plugin");
types.Add(".vrml", "application/x-vrml");
types.Add(".vrt", "x-world/x-vrt");
types.Add(".vsd", "application/x-visio");
types.Add(".vst", "application/x-visio");
types.Add(".vsw", "application/x-visio");
types.Add(".w60", "application/wordperfect6.0");
types.Add(".w61", "application/wordperfect6.1");
types.Add(".w6w", "application/msword");
types.Add(".wav", "audio/wav");
types.Add(".wb1", "application/x-qpro");
types.Add(".wbmp", "image/vnd.wap.wbmp");
types.Add(".web", "application/vnd.xara");
types.Add(".wiz", "application/msword");
types.Add(".wk1", "application/x-123");
types.Add(".wmf", "windows/metafile");
types.Add(".wml", "text/vnd.wap.wml");
types.Add(".wmlc", "application/vnd.wap.wmlc");
types.Add(".wmls", "text/vnd.wap.wmlscript");
types.Add(".wmlsc", "application/vnd.wap.wmlscriptc");
types.Add(".word", "application/msword");
types.Add(".wp", "application/wordperfect");
types.Add(".wp5", "application/wordperfect");
types.Add(".wp6", "application/wordperfect");
types.Add(".wpd", "application/wordperfect");
types.Add(".wq1", "application/x-lotus");
types.Add(".wri", "application/mswrite");
types.Add(".wrl", "application/x-world");
types.Add(".wrz", "model/vrml");
types.Add(".wsc", "text/scriplet");
types.Add(".wsrc", "application/x-wais-source");
types.Add(".wtk", "application/x-wintalk");
types.Add(".xbm", "image/x-xbitmap");
types.Add(".xdr", "video/x-amt-demorun");
types.Add(".xgz", "xgl/drawing");
types.Add(".xif", "image/vnd.xiff");
types.Add(".xl", "application/excel");
types.Add(".xla", "application/excel");
types.Add(".xlb", "application/excel");
types.Add(".xlc", "application/excel");
types.Add(".xld", "application/excel");
types.Add(".xlk", "application/excel");
types.Add(".xll", "application/excel");
types.Add(".xlm", "application/excel");
types.Add(".xls", "application/excel");
types.Add(".xlt", "application/excel");
types.Add(".xlv", "application/excel");
types.Add(".xlw", "application/excel");
types.Add(".xm", "audio/xm");
types.Add(".xml", "text/xml");
types.Add(".xmz", "xgl/movie");
types.Add(".xpix", "application/x-vnd.ls-xpix");
types.Add(".xpm", "image/xpm");
types.Add(".x-png", "image/png");
types.Add(".xsr", "video/x-amt-showrun");
types.Add(".xwd", "image/x-xwd");
types.Add(".xyz", "chemical/x-pdb");
types.Add(".z", "application/x-compressed");
types.Add(".zip", "application/zip");
types.Add(".zsh", "text/x-script.zsh");
return types;
}
}
}
Here is the library: Suddenelfilio.ExtensionMethods.zip
Downloaded 204 times
How to get the mime type of a file using the name of a file in C#
Posted by suddenelfilio in Visual Studio .Net on 31/08/2010
UPDATE: in PART 2: How to get the mime type of a file using the name of a file in C# I updated the library so it first tries to look up the mime type in a hard coded table
I recently needed to know the MIME type of a file or a file name. I know this is not that difficult certainly if you know that all the known mime types are stored in the registry of Windows. There is one caveat though, the extension you are resolving must be registered first. For example if you don’t install Adobe Acrobat PDF reader then the .pdf extension is not known and my solution I propose below won’t return any result. What you can do is either add the extension manually to the registry or install the corresponding application on the machine that needs to know about it.
Okay I’ve created a small (at least for the moment) library that allows you to call GetMimiType() on either a string or System.IO.FileInfo instance. Of course when you call this method on a string make sure the value is a valid file name! I’ve created 2 extension methods for this that can both be found in Suddenelfilio.ExtensionMethods.IO.
Here is the code to find a mime type in the registry:
string fileExtension = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fileExtension);
if (rk != null && rk.GetValue("Content Type") != null)
return rk.GetValue("Content Type").ToString();
return null;
Now if you want to use my library and its extension methods below is a sample of a console’s application Program.cs file:
using System;
using System.IO;
using Suddenelfilio.ExtensionMethods.IO;
namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
//Using a string with a filename as value.
string name = "d:\\test.txt";
Console.WriteLine("mimetype for file {0} is {1}", name, name.GetMimeType());
FileInfo info = new FileInfo("d:\\test.txt");
Console.WriteLine("mimetype for file {0} is {1}", info.FullName, info.GetMimeType());
Console.ReadLine();
}
}
}
The result in the console application is the following:
Here is the download containing the dll with the extension methods: Look at the follow up article
Increase Kooboo performance in IIS 7
Posted by suddenelfilio in Asp.net, Visual Studio .Net, Web & Design on 10/08/2010
Lately I’ve been working with the Kooboo CMS which is built using ASP.NET MVC. I really like the speed Kooboo allows you to build a website with dynamic content. All that fancy footwork comes with a downside. The first time you call a Kooboo application it is really and do mean REALLY slow to start. Cause? Well the Asp.net MVC framework, Microsoft Entity framework and most of all I think the extensive caching mechanism.
I’ve experienced waiting times up till 30 seconds for the first page to appear, now this is not really acceptable for any site I admit. I remembered that there is IIS 7 extension called application warm-up tool that you can configure to call a certain url when the worker process recycles. This will trigger the site to startup again and load up all the caching and stuff. I’m not saying that the next call will be blazingly fast but at least your request will be served much faster.
I’m currently developing several sites using the Kooboo platform and I’m pleasently surprised of the possibilities of the platform. Thumbs up for the creators!
WpfToolkit + VisualStateManager + Visual studio .net 2008 = hotfix time
Posted by suddenelfilio in Visual Studio .Net, WPF on 05/07/2010
I got into playing a bit with WPF. I had to look at some reference samples that were created by some of my colleagues and I found that I had an issue opening any xaml file in the visual studio .net 2008 designer. The problem was the VisualStateManager.VisualStateGroups that could not be resolved. Appareantly this is some that has been introduced in the WPFToolkit which is used by our development team.
After some Googling for the issue I discovered a Hotfix released by Microsoft that should resolve my issues. The thing about this hotfix was that you also neede to install another hotfix because the fix might break something else. You gotta love the irony in that!
Anyways the hotfixes I’m talking about can be found here:
- KB958017 – Rollup Hotfix for several issues in WPF designer Visual Studio 2008
- KB963035 – VS2008 SP1 sometimes hangs irretrievably after WPF Designer
After installing both hotfixes the problem was gone I can now open the xaml files that use VisualStateManager.
More information about the VisualStateManager itself can be found here: http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx
Microsoft Tag gets an update to their API?
Posted by suddenelfilio in .net, MSTagLib, Visual Studio .Net, Web Services on 12/03/2010
I’ve been reading through the MS Tag support forums over at getsatisfaction.com and noticed that it seems they’ve picked up on adding new features that have been asked as business cases as well as a possible update the TAG API to be released. Note that I have not got any comfimation on all of this but it does make me hopeful!
Microsoft Tag Rest API & Silverlight
Posted by suddenelfilio in .net, Asp.net, MSTagLib, Silverlight, Visual Studio .Net, Web Services on 11/03/2010
Recently I was contacted by a developer that was working with my MS Tag REST service. He was was calling the REST API from within silverlight. I helped him out with some questions and in return I got a sample project that I can distribute as reference sample. The sample will allow you to create a vcard Tag from within a silverlight application and then display the generated tag.
Live demo : http://tag.ws.suddenelfilio.net/demo/silverlight/Default.aspx
Source Code: Download
Downloaded 152 times
I would foremost like to thank Brian King for his effort in creating this sample for everyone that is interested in it. If you like it, please leave a comment to thank him!
MSMQ Message priority
Posted by suddenelfilio in Visual Studio .Net on 22/10/2008
In my recent development I’ve been using msmq to store messages that can’t reach a wcf service when it’s not available. I was setting the Message (System.Messaging) property Priority so that the queue would prioritize the incoming messages.
However when I looked at the queue all the messages their priorities where 0 or “Lowest”. It seems to be because my queue is transactional (which is a requirement for the msmqintegrationbinding). It was a bit of a disappointment that I couldn’t control the priority using the native msmq features, but hey that’s the price I had to pay for some other great functionality.


