Cool Tool: Cassini here power toy

[...]The .NET Framework 2.0 comes with a built-in webserver, based on the old Cassini web server. So I wanted to be able to easily set up any directory to have its contents served up on an as-needed basis. The result is an addition to the Windows Explorer right-click menu...[Robert McLaws] Chris Fraizer wrote it thgether in a small app. Here is my version with a few modifications: using System; using System.IO; using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; using System.Text; using System.Runtime.InteropServices;   namespace WebServerHere {     class Program     {         static void Main(string[] args)         {             if (args.Length >= 1)             {                 string _path;                   string _command =                     Path.Combine(                     RuntimeEnvironment.GetRuntimeDirectory(),                     "WebDev.WebServer.EXE");                   StringBuilder _commandArgs = new StringBuilder();                   Random _r = new Random();                   string _port = _r.Next(1024, 9000).ToString();                   if (args.Length == 2)                 {                     _port = args[1];                 }                     //grab the original path                 _path = args[0];                   _commandArgs.Append(" /path:\"");                 _commandArgs.Append(_path);                 _commandArgs.Append("\"");                 _commandArgs.Append(" /port:");                 _commandArgs.Append(_port);                 _commandArgs.Append(" /vpath: \"/");                 _commandArgs.Append(_path.Substring(                     _path.LastIndexOf('\\') + 1));                 _commandArgs.Append("\"");                   ProcessStartInfo _info =                     new ProcessStartInfo();                   _info.Arguments = _commandArgs.ToString();                 _info.CreateNoWindow = true;                 _info.FileName = _command;                 _info.UseShellExecute = false;                 _info.WorkingDirectory =                     _command.Substring(0, _command.LastIndexOf('\\'));                     Process.Start(_info);                   using (Control _c = new Control())                 {                     Help.ShowHelp(_c, "http://localhost:" + _port + "/");                 }             }             else             {                 MessageBox.Show("Usage:\n\tWebServerHere.exe <path> [port]",                     "WebServerHere", MessageBoxButtons.OK,                     MessageBoxIcon.Information);             }         }     } } And the Non-Admin installation reg-file: Windows Registry Editor Version 5.00 [HKEY_Current_User\SOFTWARE\Classes\Folder\shell\VS2005 WebServer]@="ASP.NET 2.0 Web Server Here" [HKEY_Current_User\SOFTWARE\Classes\Folder\shell\VS2005 WebServer\command]@="\"%SystemRoot%\\System32\\WebServerHere.exe\" %1"

A week full of community

Monday: I met Andreas Hoffmann (2nd UG Lead of the VfL Usergrop) and Peter Nowak (Head of FIAEon.net, a community for .NET related vocational education) at Starbucks in Düsseldorf. Tuesday: Benjamin Mitchell notified me that one of my sessions was voted by the british community and I'll have a session at the Developer Developer Developer Day. Wednesday: I'm in contact with the Student Partners in Wuppertal now (better said Anselm Haselhoff because Marcel Wiktorin is moving and has not replied yet :-)). Thursday: Usergroup meeting in Düsseldorf: Sebastian Weber (Developer Evengelist at Microsoft Germany and member of the VfL-UG) answered all our members questions about SQL Server 2005 and Tuan Nguyen (Lead of annos.de and VfL-Member) talked about the Annos project. Great, thanks guys. Friday: I updated the VfL-Site and fixed a few bugs.

Internet Explorer Developer Toolbar Beta

The IE Developer Toolbar provides several features for deeply exploring and understanding Web pages.-- Explore and modify the document object model (DOM) of a web page.-- Locate and select specific elements on a web page through a variety of techniques.-- Selectively disable Internet Explorer settings.-- View HTML object class names, ID's, and details such as link paths, tab index values, and access keys.-- Outline tables, table cells, images, or selected tags.-- Validate HTML, CSS, WAI, and RSS web feed links.-- Display image dimensions, file sizes, path information, and alternate (ALT) text.-- Immediately resize the browser window to 800x600 or a custom size.-- Selectively clear the browser cache and saved cookies. Choose from all objects or those associated with a given domain.-- Choose direct links to W3C specification references, the Internet Explorer team weblog (blog), and other resources.-- Display a fully featured design ruler to help accurately align objects on your pages. http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en

Poland Rocks

It was the second time this year I went to Warsaw (Poland). The Microsoft Technology Summit happend for the first time and was a big success. An amazing event: Two days, about two-thousand attendees, six parallel tracks, four a day. I had about three-hundred listeners in each of my sessions ("Layout and Personalization with ASP.NET 2.0" and "Data-Driven Application with ASP.NET 2.0"). The feedback in the breaks was great. Thanks to everybody at Microsoft Poland especially Artur and Dominika. I met Rafal Lukawiecki Fred Baumhardt and Maciej Pilecki And had an interesting discussion with Yogesh Bhalerao.The audience while i was speaking And the view out of my room in the Meriott. http://www.mts2005.pl/

Don't mess with sharepoint...

Carefully said I do not like that sharepoint "hijacks" the Internet Information Server. When you create a virtual directory it is just not accessable because SharePoint took over IIS. Funny fact: This is the second post how to fix issues with IIS and "extension" that cause issues :-) So i decided to hack a small utility serving my needs: ExcludeFromSharepoint.zip (3.46 KB) Enables to exclude applications from sharepoint services through the directory context menu. Install using the "-install" switch; Uninstall using "-uninstall" switch. Because I'm running my machine under a LUA (Limited User Account) i wrote the tool in a way that you can install and uninstall it without administative rights - the contextmenu will be installed per user! if(args[0]=="-install") {     RegistryKey _rkey = Registry.CurrentUser;     _rkey = _rkey.OpenSubKey("SOFTWARE\\Classes",true);     _rkey = _rkey.CreateSubKey("Folder").CreateSubKey("shell");     _rkey = _rkey.CreateSubKey("Exclude from Sharepoint");     _rkey = _rkey.CreateSubKey("command");     _rkey.SetValue(null, App.Application.ExecutablePath + " \"%1\""); } else if(args[0]=="-uninstall") {     RegistryKey _rkey = Registry.CurrentUser;     _rkey = _rkey.OpenSubKey("SOFTWARE\\Classes\\Folder\\shell",true);     _rkey.DeleteSubKeyTree("Exclude from Sharepoint"); } else { ... }   The Implementation works with the webserver extensions version 4.0 or higher       RegistryKey _rkey = Registry.LocalMachine;     _rkey = _rkey.OpenSubKey("SOFTWARE\\Microsoft\\Shared Tools\\" +         "Web Server Extensions",true);         foreach(string _subKeyName in _rkey.GetSubKeyNames())     {         try         {             int.Parse(_subKeyName.Replace(".",""));             RegistryKey _fpKey = _rkey.OpenSubKey(_subKeyName,true);             _fpDir = (string)_fpKey.GetValue("Location");         }         catch(Exception _ex)         {             string _err = _ex.ToString();             break;         }     }   and uses the stsadm.exe from the shared tools of the server extensions.     System.Diagnostics.Process _p = new System.Diagnostics.Process();     _p.StartInfo.FileName = Path.Combine(_fpDir, "BIN\\stsadm.exe");     _p.StartInfo.Arguments = "-o addpath -url http://localhost/" +         _strProjectName + " -type exclusion";     ...     _p.Start();  

ASP.NET Version Issues

I develop with 1.1 and 2.0 - When VS 2003 creates a web solution it is configured to use the 2.0 runtime. Placeing the following code to the Global.asax's of your 1.1 projects and setting execute permissions on the aspnet_regiis.exe helps much. protected void Application_Start(Object sender, EventArgs e) {       if(System.Environment.Version.Major==2)       {             System.Diagnostics.Process _p = new System.Diagnostics.Process();             _p.StartInfo.FileName = "%WINDIR%\\Microsoft.NET\\Framework\\v1.1.4322\\aspnet_regiis.exe";             _p.StartInfo.Arguments = "-s W3SVC/1/ROOT" + Request.ApplicationPath;             _p.StartInfo.UseShellExecute = false;             _p.StartInfo.RedirectStandardOutput = true;             _p.Start();       } }  

Simply resize an uploaded image

I got an E-Mail from a student this morning asking how to thumbnail an uploaded image. Here is a "quick" solution (there are a few things you can do to increase quality, set JPEG compression factor or keep gif transparency). If you like to dig deeper have a look at one of the articles i wrote for the DotNetPro magazine's #Talk column (dnp0305_Thumbnail.pdf [German])   <%@ Page Language="C#" %>   <script runat="server" Language="C#">       public void UploadFile(object sender, EventArgs e)     {         System.Drawing.Image _img =              System.Drawing.Image.FromStream(             this.InputTypeFile.PostedFile.InputStream);           int _maxWidth = 100;         int _maxHeight = 100;           int _width = _img.Width;         int _height = _img.Height;           string _filename =               System.IO.Path.GetFileName(               this.InputTypeFile.PostedFile.FileName);                     string _uploadPath = System.IO.Path.Combine(             Server.MapPath(".\\upload\\"),             _filename);                 if (_width > _height)         {             width = Math.Abs((int)(height *                         _img.Width /                         _img.Height));             _height = _maxHeight;         }         else         {             _height = Math.Abs((int)(_maxWidth *                         _img.Height /                         _img.Width));             _width = _maxWidth;         }                 System.Drawing.Image _newImg =             _img.GetThumbnailImage(width, height, null, null);            _newImg.Save(_uploadPath);            _img.Dispose();     }   </script> <body>     <form id="form1" runat="server">       <input id="InputTypeFile" type="file" runat="server" />     <asp:Button ID="Submit" OnClick="UploadFile" Text="Upload" />       </form> </body> </html>

RE: httpOnly cookies in ASP.NET 1.1

Scott posted a solution to support httpOnly cookies in ASP.NET 1.1 but pointed out some problems when you run the code on 2.0(http://www.hanselman.com/blog/HttpOnlyCookiesOnASPNET11.aspx) Here is a solution: protected void Application_EndRequest(Object sender, EventArgs e) { if(System.Environment.Version.Major<2) { foreach(string cookie in Response.Cookies) { const string HTTPONLY = ";HttpOnly"; string path = Response.Cookies[cookie].Path; if (path.EndsWith(HTTPONLY) == false) { //force HttpOnly to be added to the cookie Response.Cookies[cookie].Path += HTTPONLY; } } } }

Re: Windows Impersonation in ASP.NET

Pierre posted an entry bout impersonation in ASP.NET szenarios. [Pierre]There are several scenario where you have to use the impersonation in ASP.NET. Consider, for example, you have to save and load files from a network share (file server). In that case, if the web site accept anonymous authentications, you have to impersonate a windows user who has enought privileges to access to that resource. You have three choices (I guess): Elevate the ASP.NET process identity - worse case since you could compromise the whole site security Impersonate a windows user during the single call (http://blogs.msdn.com/shawnfa/archive/2005/03/22/400749.aspx) Demand the task to a COM+ server application I think that the last is the best since we have more security and maintenance control[...] I agree with him that "Demand the task to a COM+ server application" is the best way of the three he listed. But for me impersonation it is still a don't. By the way i wanted to post this as a comment but "Comments on this post are closed". Yes this is some criticism on weblogs.asp.net :-) ... So here my opinion as post in my blog: Avoid impersonation! If you need to "redirect a binary that is located on a different box than the webserver to the client" utilize another IIS on the 2nd machine or write a service that returns the binary data.