Jan
20
2011

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)
Sep
1
2009
.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);
Aug
7
2009
.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.
Jul
25
2009
.NET // C# // Microsoft

Efficient iterations using the yield keyword

Quick overview of the yield keyword in C#. [More]