Using IHttpModule to overlay a website

I ran into the need to shut down an application for maintenance. What I needed is a plugin that I could drop on any website and it will create an overlay on top and disable all functionality. It had to also display a message notifying the users what's going on. Using an HttpModule seems to be the most logical way to go about that. First I create a class that inherits IHttpModule. In the implementation of the BeginRequest I inject a div overlay and the message into the body of the page. void context_BeginRequest(object sender, EventArgs e) { System.Web.HttpContext context = System.Web.HttpContext.Current; string message = System.Configuration.ConfigurationManager.AppSettings["WarningMessage"]; if (String.IsNullOrWhiteSpace(message)) message = "The web site is down for maintenance. Please check back again later."; context.Response.Filter = new OverlayInjector(context.Response.Filter, message); } I also created OverlayInjector : System.IO.Stream class to help with the injection overriding the Write method like that: public override void Write(byte[] buffer, int offset, int count) { var data = new byte[count]; Buffer.BlockCopy(buffer, offset, data, 0, count); string html = Encoding.Default.GetString(buffer); html = html.Replace("", "<div style='position: absolute; left: 100px; top: 250px; z-index: 999; color: red; font-weight: bold; font-size: 1.5em; width: 75%; background-color: #ffffcc; padding: 10px; text-align: center;'>" + _message + "</div> byte[] outdata = Encoding.Default.GetBytes(html); _stream.Write(outdata, 0, outdata.GetLength(0)); } Finally all I need to do is drop the dll into the bin of the website I want to implement this to and add two entries into the web.config file: <appSettings> <add key="WarningMessage" value="Down for maintanence check back on 1/1/2020"/> </appSettings> <httpModules> <add name="HttpModuleOverlay.Overlay" type="HttpModuleOverlay.Overlay"/> </httpModules> You can download the code here. HttpModuleOverlay.rar (16.64 kb)
.NET 4.0 // C# // EF

Entity Framework 4.0 - Running Ad hoc Queries or Commands

A nice addition to the latest version of ADO.NET Entity Framework is the ability to run ad hoc commands.  Two methods of the Entity Context have been introduced to accomplish that: ExecuteStoreQuery and ExecuteStoreCommand. The tricky part is passing the parameters. They are index based so the example below shows you how. string sql = "SELECT Col1, Col2 FROM MyUdf({0},{1});"; IEnumerable<MyComplexType> list = dbclient.ExecuteStoreQuery<MyComplexType>(sql, parameter1, parameter2);

WPF Themes

WPF Style themes by Microsoft, combined. [More]
.NET 4.0 // C# // WF

Running Workflows in .NET 4.0

Workflows can be run synchronously and asynchronously. Below is an example how you run a workflow instance synchronously: Dictionary<string, object> inputs = new Dictionary(); inputs.Add("InArgument", "SomeValue"); inputs.Add("InOutArgument", "SomeOtherValue"); WorkflowElement activity = workflow; IDictionary<string, object> outputs = WorkflowInvoker.Invoke(new MyWorkflow(), inputs); MyObject obj = (MyObject)outputs["OutArgument"]; MyOtherObject obj = (MyOtherObject)outputs["InOutArgument"]; Note that now workflows have arguments as well as parameters. Arguments are for passing data to and from the Workflow where parameters are for internal use. Remember: Workflow is an activity so the same goes for any custom activity you create. Any In or In/Out arguments have to be passed to the workflow for it to execute. Now here is a very simplified example of how to run a workflow instance asynchronously. The OnCompleted event is raised when the workflow has finished running and the IDictionary<string, object> outputs can be read off of the WorkflowCompletedEventArgs. ManualResetEvent resetEvent = new ManualResetEvent(false); WorkflowInstance instance = new WorkflowInstance(new MyWorkflow()); instance.OnCompleted = delegate(WorkflowCompletedEventArgs e) { Console.WriteLine("workflow instance completed, Id = " + instance.Id); resetEvent.Set(); }; instance.Run(); resetEvent.WaitOne(); I haven't done it yet but I presume running a workflow in IIS and interacting with it before it finishes would not be as staighforward as the examples above.

In .NET 4.0 SecurityManager.IsGranted is obsolete

In .NET 4.0 SecurityManager.IsGranted has been made obsolete.  This is what it was and if you compile in .NET 4.0 compatibility it will complain. bool isGranted = SecurityManager.IsGranted(new SecurityPermission(SecurityPermissionFlag.Infrastructure)) In order to fix this now you have to do this instead. var permissionSet = new PermissionSet(PermissionState.None); permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); bool isGranted = permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet);