C# Posts

  • Per Lundberg (gravatar)

    Triggered by a recent blog posting by Andreas Finne, I’ll share a convenient extension method that I have written.

    First, let’s give an introduction the “why” that triggered me writing this extension method from the beginning. The List<T> generic class is a pretty good class for keeping a list of objects (which are strongly typed, because this is a generic type). The List<T>, in turn, implements the ICollection<T> interface, which has a method defined which looks like this:

    void Add(T item);

    Now, there is only one big problem with this method: it should really return an ICollection<T>. Why, oh why didn’t Microsoft think of that? That way, you could have written your code like this:

    IEnumerable<Customer> customers = new List<Customer>()
        .Add(new Customer { CustomerNumber = 12345, Name = "Customer #1" })
        .Add(new Customer { CustomerNumber = 23456, Name = "Customer #2" });

    The problem withthis code snippet is that the Add() method returns void, which in turns means that the “fluid” syntax above is not possible.

    Not until you work around it, that is. :-)

    The way we can solve this is by writing a generic extension method that works on an ICollection<T> object and does the Add() and then returns the collection itself. That way, we should be able to accommodate a similar syntax similar to this.

    I prefer to place my extension methods in a class which is named “<class>ExtensionMethods”, where <class> is the name of the class which the extension methods operate on. Thus, I will call this class ICollectionTExtensionMethods. Here is the code:

    public static class ICollectionTExtensionMethods
    {
        /// <summary>
        /// Adds an item to the <see cref="System.Collections.Generic.ICollection&lt;T&gt;"/>.
        /// </summary>
        /// <typeparam name="T">The type of object which the collection contains</typeparam>
        /// <param name="collection">The <see cref="System.Collections.Generic.ICollection&lt;T&gt;"/> to operate on</param>
        /// <param name="item">The object to add to the <see cref="System.Collections.Generic.ICollection&lt;T&gt;"/></param>
        /// <returns>The <see cref="System.Collections.Generic.ICollection&lt;T&gt;"/> we are operating on</returns>
        public static ICollection<T> AddWithReturn<T>(this ICollection<T> collection, T item)
        {
            collection.Add(item);
            return collection;
        }
    }

    (I copied the XML documentation from the ICollection<T> interface definition metadata. :-)

    Now, we can write some code that looks like this: (Remember to include a using-line for the namespace where you placed this ICollectionTExtensionMethods class.)

    IEnumerable<Customer> customers = new List<Customer>()
        .AddWithReturn(new Customer { CustomerNumber = 12345, Name = "Customer #1" })
        .AddWithReturn(new Customer { CustomerNumber = 23456, Name = "Customer #2" }); 

    Pretty nice, huh? :-)

    Alright, this was it for this time. HTH!

  • Andreas&#32;Finne (gravatar)

    I found some really nice code the other day. Unfortunately I cannot say that I wrote it myself, but I think it’s so cool that it needs to be published here. It was written by “mazzy maxim” as Community Content to MSDN. What it does is to extend the OrderBy method for IEnumerables. You provide the name of the property to sort by, and the sort order.

    Without further ado, here is the code:

    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> items, string property, bool ascending)
    {
        var MyObject = Expression.Parameter(typeof(T), "MyObject");
        var MyEnumeratedObject = Expression.Parameter(typeof(IEnumerable<T>), "MyEnumeratedObject");
        var MyProperty = Expression.Property(MyObject, property);
        var MyLambda = Expression.Lambda(MyProperty, MyObject);
        var MyMethod = Expression.Call(typeof(Enumerable),
                                       ascending ? "OrderBy" : "OrderByDescending",
                                       new[] { typeof(T), MyLambda.Body.Type },
                                       MyEnumeratedObject,
                                       MyLambda);
        var MySortedLambda = Expression.Lambda<Func<IEnumerable<T>, IOrderedEnumerable<T>>>(MyMethod, MyEnumeratedObject).Compile();
        return MySortedLambda(items);
    }

    So what we have is a generic extension method for IEnumerables that creates a  lambda expression on the fly to sort the objects by the property with the given name.

    Pretty cool or what?

    Now, some of you may argue that sorting by the name of the property introduces magic strings and doesn’t feel “right”. I can agree with that to some extent, but it is not much different to NotifyPropertyChanged(“property”), and my opinion is that this extension method still can have its place.

    I have used it when I needed the sorting of an object collection to be in the ViewModel rather than in the View. The reason for this was that the collection could be changed by a synchronization thread, and since the sort order was stored in the View, the ordering got reset. By using this method in the ViewModel, the sorting state was moved away from the View. The object collection was shown in a table, and the property to sort by was chosen by clicking on a column header. Clicking the header changed the OrderedBy property exposed by the ViewModel, and the collection was re-sorted accordingly.

  • Mikael&#32;Riska (gravatar)

    Those of you that are familiar with eCraft and the types of applications we create, know that we mostly work with business applications and shuffle data back and forth between different back office systems or create applications that lets users interact with back office systems through more lightweight user interfaces tailored for their daily tasks. Therefore it was very interesting to be able to do yet another Microsoft Surface project, this time where the application was not data-centric but instead the focus was shifted towards the presentation end of the spectrum. We were given the opportunity to develop a Surface application to be used at the Nobel festivities with a very tight deadline for the development work. You can read a blog post about our involvement in the project here (in Finnish).

    The design called for the Surface background to be sensitive to touch so that the users would be able to paint with their fingers on the screen and so that the paint would gradually fade out over time. The Surface SDK provides a SurfaceInkCanvas control that would easily handle the painting part, but achieving the kind of fade out that we wanted did not seem possible that way. Instead I started looking into the possibility of programmatically generating and updating a bitmap and discovered that it is possible through the use of the WriteableBitmap to do just that. In case you want to do this, make sure that you are using a recent version of the .Net Framework. At least .Net 3.5 and newer have implemented WriteableBitmap using double buffering and other techniques that guarantee it is performant enough for updating the bitmap often. We ended up using a bitmap image of size 1027x768 (Surface resolution) as the background of the application and any finger touch on this would start painting with a small 60x60 brush on the bitmap. We randomly used one of several slightly different brushes to achieve a more “alive” stroke as we painted. The brushes we used were 24-bit PNGs with about 50% alpha in the middle increasing to completely transparent towards the perimeter.

    The following functions shows how we used WriteableBitmap to achieve the intended effect of blending together the brush bitmap with whatever was already on the background. Rows 6-11 make sure that in case the contact point is close to the edge of the background bitmap,only the correct part of the brush will be used to update the background. And in lines 26-47 we extract the Red, Green, Blue and Alpha values from both the background and the brush image and blend them together and construct the new image pixel.

    private void UpdateBitmap(WriteableBitmap bitmap, BitmapImage brush, Point centerPoint)
    {
        if ((int)centerPoint.X >= 0 && (int)centerPoint.X < bitmap.PixelWidth
             && (int)centerPoint.Y >= 0 && (int)centerPoint.Y < bitmap.PixelHeight)
        {
            int bitmapX = Math.Max((int)centerPoint.X - brush.PixelWidth / 2, 0);
            int bitmapY = Math.Max((int)centerPoint.Y - brush.PixelHeight / 2, 0);
            int brushX = Math.Max(brush.PixelWidth / 2 - (int)centerPoint.X, 0);
            int brushY = Math.Max(brush.PixelHeight / 2 - (int)centerPoint.Y, 0);
            int brushWidth = Math.Min(brush.PixelWidth - brushX, Math.Min(bitmap.PixelWidth - bitmapX, brush.PixelWidth));
            int brushHeight = Math.Min(brush.PixelHeight - brushY, Math.Min(bitmap.PixelHeight - bitmapY, brush.PixelHeight));
    
            Int32Rect brushRect = new Int32Rect(brushX, brushY, brushWidth, brushHeight);
            Int32Rect bitmapRect = new Int32Rect(bitmapX, bitmapY, brushWidth, brushHeight);
    
            int stride = (brushRect.Width * brush.Format.BitsPerPixel + 7) / 8;
            var brushPixels = new UInt32[brushRect.Width * brushRect.Height];
            var imagePixels = new UInt32[brushRect.Width * brushRect.Height];
    
            brush.CopyPixels(brushRect, brushPixels, stride, 0);
            bitmap.CopyPixels(bitmapRect, imagePixels, stride, 0);
            bitmap.Lock();
    
            for (int i = 0; i < brushPixels.Length; i++)
            {
                UInt32 brushA = (brushPixels[i] & 0xFF000000) >> 24;
                UInt32 brushR = (brushPixels[i] & 0x00FF0000) >> 16;
                UInt32 brushG = (brushPixels[i] & 0x0000FF00) >> 8;
                UInt32 brushB = (brushPixels[i] & 0x000000FF);
    
                UInt32 imageA = (imagePixels[i] & 0xFF000000) >> 24;
                UInt32 imageR = (imagePixels[i] & 0x00FF0000) >> 16;
                UInt32 imageG = (imagePixels[i] & 0x0000FF00) >> 8;
                UInt32 imageB = (imagePixels[i] & 0x000000FF);
    
                //(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bd (1 - As), As As + Ad (1 - As))
                imageR = (brushR * brushA + 255 * imageR - imageR * brushA) / 255;
                imageG = (brushG * brushA + 255 * imageG - imageG * brushA) / 255;
                imageB = (brushB * brushA + 255 * imageB - imageB * brushA) / 255;
                imageA = Math.Max((brushA * brushA + 255 * imageA - imageA * brushA) / 255, imageA);
    
                imageA = imageA << 24;
                imageR = imageR << 16;
                imageG = imageG << 8;
                //imageB = imageB;
    
                imagePixels[i] = imageA | imageR | imageG | imageB;
            }
    
            // copy in the changed pixels
            bitmap.WritePixels(bitmapRect, imagePixels, stride, 0);
    
            // Specify the area of the bitmap that changed.
            bitmap.AddDirtyRect(bitmapRect);
    
            // Release the back buffer and make it available for display.
            bitmap.Unlock();
        }
    }

    In order to achieve the wanted fade out effect we had another function that we called from a timer that would adjust the alpha channel value of every pixel in the background bitmap.

    private void FadeBitmap(WriteableBitmap bitmap, Int32Rect rect)
    {
        var imagePixels = new UInt32[bitmap.PixelWidth * bitmap.PixelHeight];
        bitmap.CopyPixels(rect, imagePixels, bitmap.BackBufferStride, 0);
        bitmap.Lock();
    
        for (int i = 0; i < imagePixels.Length; i++)
        {
            UInt32 imageA = (imagePixels[i] & 0xFF000000) >> 24;
            imageA = imageA < 10 ? 0 : imageA - 10;
            imageA = imageA << 24;
            imagePixels[i] = imageA | imagePixels[i] & 0x00FFFFFF;
        }
    
        // copy in the changed pixels
        bitmap.WritePixels(rect, imagePixels, bitmap.BackBufferStride, 0);
    
        // Specify the area of the bitmap that changed.
        bitmap.AddDirtyRect(rect);
    
        // Release the back buffer and make it available for display.
        bitmap.Unlock();
    }

    In our implementation we faded the entire background image during every cycle. In a slightly more fancy version we could partition the screen into smaller spaces and keep track of which partitions actually contain any pixels that needs fading, increasing the complexity a bit but drastically cutting down on the amount of bitmap updates needed. That improvement is left as an exercise for the reader :)

    In closing, I found that this was a very interesting project to work on and it was really invigorating to be forced to think about bitwise operations and bit shifting. In the normal projects we do, there are seldom any need for going into that level of low-level funkiness.

  • Tero&#32;Tapanainen (gravatar)

    I usually start learning new technologies by doing something more than hello world example. This time I wanted to learn Silverlight and decided to build Othello game. I have done it with other technologies as well like Java ME so I was quite familiar with the game concepts. So I just rushed to code.

    My first task was to create the game board. Game board in Othello is 8x8 in size and each of the places can be in one of the following state: white,black or empty. I first created a UserControl called GameButton to visualize the state of the game board place. The Game button contains visualization of all the states. When the state changes from white to black or vise versa the state change is animated by flipping the button along x-pane.

    Next I created the main Window with one Grid called LayoutRoot. Because I have strong background on Windows Forms I  thought that it is impossible to creating the board dynamically without writing some code behind code (you will notice how wrong I was).

    List<List<GameButton>> buttons = new List<List<GameButton>>();
    for(int i = 0; i < 8; i++)
    {
        buttons.Add(new List<GameButton>());
        for(int j=0; j < 8; j++)
        {
            GameButton button = new GameButton();
            button.ButtonState = GameButtonState.Empty;
            button.SetValue(Grid.RowProperty, i);
            button.SetValue(Grid.ColumnProperty, j);
            LayoutRoot.Children.Add(button);
            buttons[i].Add(button);
        }
    }
    buttons[3][3].ButtonState = GameButtonState.White;
    buttons[3][4].ButtonState = GameButtonState.Black;
    buttons[4][3].ButtonState = GameButtonState.Black;
    buttons[4][4].ButtonState = GameButtonState.White;

    This code smells, my game state (Model) is not separated from the view. Also I have UI logic both in XAML file and code behind. This means that designer tools like Expression Studio will not have any glue what controls the Grid contains.

    I knew that there has to be a better way to do this in XAML. I investigated a bit and found out that this can be fairly easily implemented. Here is the result of new version written in XAML.

    <Grid x:Name="LayoutRoot" Background="White">
        <ItemsControl x:Name="GameButtons"  ItemsSource="{Binding GameBoard}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ItemsControl x:Name="Row" ItemsSource="{Binding}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal">
                                </StackPanel>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <local:GameButton ButtonState="{Binding GameRegionState}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

    As you can see I have two nested ItemsControls. The first one is bind to the GameBoard property (List<List<State>>) of the OthelloGame class. The Row ItemsControl contains now the GameButton and the ButtonState is bind. I have now only few lines of code in code behind to bind the game state to the view. Now this starts to look good. Also if I would like to have bigger board it could be easily done by just adding more States to the List.

    I would still like to get rid of GameButton UserControl. It contains some actions what would be nice to get from code behind to XAML side and also it is not needed because the binding takes care of creating new instances of it. The problem is that in Silverlight the triggers, actions and conditions are very limited. For silverlight 4.0 there is interesting extension library for triggers and actions called Slex. It requires Silverlight 4.0 and I was using 3.0 so I had to forget it. So if I would move the GameButton to the main view, benefits wouldn’t be that big.  So the GameButton can stay. With WPF the GameButton would be dead and buried.

    The transition from the Windows Forms to Silverlight/WPF is quite big. The controls etc. are not that different but the biggest challenge is to get your brains to work with new mindset. Lot of things that was done before in code can be done in XAML with DataTemplates, Triggers, Actions and more.

    Below is my first Silverlight application live and kicking. Computer uses minmax algorithm with a few optimizations on the normal level and calculates 4 moves ahead. 

    Download full source here.

  • Per&#32;Lundberg (gravatar)

    In this posting, I’ll give an introduction to how you can use the new features provided by ASP.NET AJAX to call methods in web services from your own JavaScript code with very little fuss. (Well, at least that’s the idea…)

    First, I want to take some steps backward and describe the history, the steps that led to the advent of ASP.NET AJAX. JavaScript has historically been a client-only language, providing some client-side events that can be used to e.g. perform certain events every time the user hovers the mouse over a certain part of the web page, or every time an HTML <button> is clicked. All of this is taking place on the client computer only, in the web browser. There is no interaction between the JavaScript code and the server providing the web page on which the JavaScript code is hosted.

    As the web applications started to be more and more advanced, the need for more interaction arose. The gap between the client and the server needed to be eradicated, somehow. The solution - or bridge, if you like - is named XMLHttpRequest. This is the very foundation that all of AJAX (including ASP.NET AJAX) relies upon.

    XMLHttpRequest is a mechanism through which a web browser (Firefox, Internet Explorer, Safari, etc.) can make a request to the server without refreshing the whole page. The request is made by client-side script, in other words, JavaScript (as much as we love it or hate it…). The initial implementation of the XMLHttpRequest was made by Microsoft as a wrapper on top of the MSXML, using ActiveX (so it was not a “pure” JavaScript functionality at that time; rather JScript). Later on, other browser vendors followed along, modeling their implementation after the Microsoft one, and eventually the XMLHttpRequest was standardized by the W3C. [1]

    So, what good does this XMLHttpRequest API do? Well, as previously mentioned, it enables client-side code (JavaScript) running in the web browser to make server-side requests for certain information, without the need for a full page reload. This makes all forms of interesting interactive web sites (or rather, web applications is a more descriptive term) possible. For example, you could have a page fetch live news from a newsfeed server, and display it on a web server, without the need for any refreshing of the page. You could have a form where the user enters a monetary value and chooses the source/target currencies, and presses a “Convert” button. The value is then converted between the given currencies, with no need for any 1990’s-style page refreshing. :-)

    In the Microsoft ASP.NET world, ASP.NET AJAX was introduced between the release of ASP.NET 3.0 and 3.5 (a pre-release named Atlas was available slightly earlier). ASP.NET 3.5 (Visual Studio 2008) has ASP.NET AJAX support out-of-the-box.

    (In the ASP.NET AJAX nomenclature, Microsoft talks about this “avoiding full page refresh” thing as partial page updates. I’ll use this phrase for the rest of this article.)

    ASP.NET AJAX can be used in two modes: “ASP.NET mode” and “JavaScript mode”. In ASP.NET mode, what you do is basically more or less embed the controls that you want to use partial-page updates for in an <asp:UpdatePanel/> control. That way, ASP.NET AJAX will “seamlessly” handle the page updates, and tunnel them through the AJAX (XMLHttpRequest) pipe. Very convenient and easy to use for the developer, but not always optimal from a performance and technical point of view. I did a simple test when writing this blog article. The source code to my test page looks like this:

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <script type="text/C#" runat="server">
    
        protected void Button_Click(object sender, EventArgs e)
        {
            Label.Text = "Moo!";
        }
        
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager EnablePartialRendering="true" runat="server" />
        <asp:UpdatePanel ID="UpdatePanel" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button" runat="server"
                            Text="Click Me!"
                            OnClick="Button_Click" />
                <asp:Label ID="Label" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>

    In other words, quite a simple page. The idea is that you click a button, and the button makes the text for a certain control be changed to “Moo!”. Since this is embedded in an UpdatePanel, this is supposed to take place using partial-page rendering techniques. The page looks like this when rendered:

     "Click Me" web page

    Now, let’s inspect what it looks like in Fiddler when the “Click Me!” button is clicked. This is what we get:

    Fiddler output of the UpdatePanel request

    The amount of overhead is immense; not speaking byte-wise, but percentage-wise. What we wanted to do is to fetch the “Moo!” text and place it in a control. This is a four byte string (if we’re talking ASCII and not UCS-2…) + maybe a trailing CR+LF or something like that. Let’s be nice and say that 10 bytes for this update would be reasonable.

    Instead, we got 571 characters being sent over the wire. That’s an incredible 5700% of the “reasonable size” being used for the request!

    Now, in reality, this is much less of a problem than I’m making it appear to be… Computers are fast nowadays, and broadband connections are common. Still, that old 640 KiB geek in me screams when I see something like this… :-) And of course, in this example, it might not be a problem, but who’re saying it wouldn’t be in a more complicated use case? What if you have more controls on the page, more viewstate to persist (which could be disabled altogether, btw.) and so forth? This can actually turn out to be a performance killer.

    The reason for this extraneous information being transferred is this: The UpdatePanel control is built in a generic way. If you look closely at my screenshot (click on it to see the full picture), you see that what is transferred is the full HTML for the content of the UpdatePanel control. This makes it simple to implement (in the UpdatePanel control itself), and also has some other advantages, but is sometimes very much less than optimal, and can also make the page give a more sluggish feeling than necessary.

    In our specific example, what we could have done instead is to just get the updated Text field and set the innerHTML property of the Label to this value. This should provide a much more optimized experience. :-) By using the client-side ASP.NET AJAX functionality, this is actually quite simple! I’ll go ahead and add a webservice to my web project, called “LabelWebService.asmx”. The .asmx file is left unmodified, and the code-behind file is modified to look like this:

    using System.Web.Script.Services;
    using System.Web.Services;
    
    namespace eCraft.AjaxWithUpdatePanel
    {
        /// <summary>
        /// Simple webservice for fetching the text for a label on a web page.
        /// </summary>
        [WebService(Namespace = "http://labs.ecraft.com/Samples/CallingWebServicesFromJavascript/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [ScriptService]
        public class LabelWebService : WebService
        {
            [WebMethod]
            public string GetText()
            {
                return "Moo!";
            }
        }
    }

    In other words, a very simple proof-of-concept web service that just returns a dummy value. Note the special attribute ScriptService on this class (from the System.Web.Script.Services namespace). What this attribute does is enable JavaScript proxy generation for your web service, enabling the service to be called from JavaScript embedded in an ASP.NET page. We might go through how this works behind the scenes some other time; for now, just accept the fact that it somehow magically creates a JavaScript wrapper class that lets you call your web service from JavaScript.

    So, let’s skip the talk and go straight on to the code, shall we? This is the modified test page, now with some embedded code for calling the web service through JavaScript:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="eCraft.AjaxWithUpdatePanel.Default" %>
    
    <script type="text/javascript">
           
        function Button_Click()
        {
            var ws = new eCraft.AjaxWithUpdatePanel.LabelWebService;
            ws.GetText(GetText_Succeeded);        
        }
    
        function GetText_Succeeded(result)
        {
            var label = $get('<%= Label.ClientID %>');
            label.innerHTML = result;
        }
        
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title></title>
    </head>
    <body>
        <form id="form2" runat="server">
        <asp:ScriptManager ID="ScriptManager1"
            EnablePartialRendering="true" runat="server">
        <Services>
            <asp:ServiceReference Path="~/LabelWebService.asmx" />
        </Services>
        </asp:ScriptManager>
            
        <asp:Button ID="Button" runat="server" Text="Click Me!"
            OnClientClick="Button_Click(); return false;" />
        <asp:Label ID="Label" runat="server" />
        </form>
    </body>
    </html>

    As you see, the page has been slightly changed from before. Maybe one of the most important changes that has taken place is that we skipped the <asp:UpdatePanel/> control altogether, but kept the <asp:ScriptManager/> one. We also added an <asp:ServiceReference/> control. This is what makes the page aware of the web service that we are about to call, and it helps the JavaScript intellisense to recognize the proxy class representing our web service.

    We have also introduced two new JavaScript functions: Button_Click() and GetText_Succeeded(). The <asp:Button/> control have also been modified to perform an OnClientClick rather than an OnClick event. (The “return false” part is important, since we would otherwise get a full page postback – that’s the default behavior of the <input type=”button”> element, which is what the Button control gets rendered as.)

    In the Button_Click() function, we create an instance of our web service wrapper class. The cool thing about this is that if you remove the code inside that function, and start typing “var ws = new e“, you should get something like this:

    Calling web services from JavaScript - intellisense screenshot

    The eCraft.AjaxWithUpdatePanel.LabelWebService class is apparently known to Visual Studio, helping us a lot. You can now use code-completion to write the full class name, just like you could for C# code. This is a good enhancement that Microsoft has done to the JavaScript language, making it more convenient to work with (even though I’m really looking forward to a possible successor to the JavaScript language altogether… The language is too “weak” and dynamic in my taste.)

    If you look at my Button_Click code again, something noteworthy is that the web service call is done slightly different than it would be done in C#. Instead of just calling the web service and getting back the result as a return value from the method, we are setting up a callback that will get called once the web service method is finished. This is a clear difference from traditional web service client code. This shows the asynchronous nature of the AJAX technology (after all, that’s what the A in AJAX stands for…). All web service calls are asynchronous when being used from JavaScript like this, and asynchronous service calls usually use callbacks to call a user-supplied method/function when the call has finished.

    The disadvantage of this is that your code can become harder to read; it is less obvious what the flow looks like. The advantage is that you can make multiple server requests at once, and in a load-balancing scenario, there could even be multiple physical servers to serve your different requests, increasing performance. It is also a good preparation for starting to work with service calls in Silverlight, which always uses asynchronous calls (at least when calling WCF services, but I guess the same goes for traditional web services as well).

    Finally, let’s look at the Fiddler output for my modified version of the program. You’ll be amazed (we hope :-). This is what it looks like:

    Fiddler output of the JavaScript web service request

    Whoha! What’s that? It clearly looks very different to before, and also extremely optimized.

    The reason why the content here looks very differently is that we’re now making a web service call rather than getting HTML data for updating the UpdatePanel. But also, it doesn’t look like the SOAP stuff that you could expect to get back from a normal web service call. This is because it uses the JSON format for serializing the data. JSON is a highly optimized format for serializing data over e.g. HTTP connections, and it is the default when using the ScriptService attribute like we’re doing here. (It usually works well, but it might not be suitable for all web service calls, perhaps especially if the data you are returning is of XML format. If necessary, you can always change to “raw XML”  as the response format. See this external blog posting for more details on that.)

    Regarding the performance, we can see that the 571 bytes from the UpdatePanel sample has now shrank to a whopping 12 bytes. Quite an improvement (97,9% actually…). With the risk of being repetitive; in this case, it might not have mattered that much, but you should be able to clearly see the potential that this method has over standard <asp:UpdatePanel/> usage. The performance is simply outstanding. The cost you have to take is that you have to write client code to update the contents of the HTML controls. Sometimes, this can be a bit of work, but it can be simplified a bit. (instead of e.g. creating an HTML table with rows and cells, you could create it from beforehand and just use style=”display: none” to hide the cells. This makes it easy to un-hide them through JavaScript; hopefully simpler or better than inserting a bunch of new nodes in the DOM tree…)

    Alright, time to close up this blog posting. In this posting, we have gone through the basics behind how AJAX works. We have also done some field testing of ASP.NET AJAX performance, first using UpdatePanel and later on using direct web service calls from JavaScript. We saw the clear performance advantage with JavaScript calling a web service vis-a-vis using the UpdatePanel, but can also understand that the UpdatePanel is often a better (or at least “simpler to implement”) choice, especially if you have a lot of code and controls in the existing implementation that you simply want to AJAXify. The UpdatePanel also makes the code slightly simpler to read and understand, since it “looks” more like traditional ASP.NET code (but this might actually be a disadvantage, since it works differently under the hood – abstraction can be good, but it can also fool you at times).

    Anyway, we now know the alternatives, so we can wisely consider them both in real-world scenarios, and use whichever one is more suitable in each specific case. Remember that system architecture is no “one size fits all” business.

    See you in my future posts; until then, take care.

  • Per&#32;Lundberg (gravatar)

    There is this saying that “there is no computer system with a decent level of self-respect that doesn’t include at least one Windows Service”. Generally, this rule seems to be pretty true. Even if you try to build as much as possible of the system with a platform such as Microsoft BizTalk Server  or Windows SharePoint Services (because of personal or customer-specified preferences), there are likely to occur certain parts of the system that are simply not feasible or practical to implement within the boundaries of the platform.

    Here are a few technical scenarios where a Windows Service could be suitable:

    • You want to perform some background processing at certain time intervals, and no other job scheduler is available. For example, you might want to wake up every 5 minutes and poll a database, and perform some operations for each record found. Such scenarios can also be considered being implemented with BizTalk Server or SQL Server Integration Services (SSIS), if available.
    • You want to listen to data arriving on a certain input channel, and do some form of processing every time data arrives. The input channel could be a TCP socket (like port 80 or 21), an MSMQ queue, or anything else. This scenario is also a valid candidate for being implemented with BizTalk.

    However, we now assume that you have investigated the alternatives and decided that a Windows Service is the most suitable option in your case.

    Writing a Windows Service is not that difficult, especially with the help provided by the .NET Framework all the way back since version 1.1 (Visual Studio 2003). Still, there are some things that could be worthwhile to think about when doing this. Some of these practices relate to the actual coding of the service, and some relate to how the service is best being deployed and set up on the server you are deploying it to.

    The target audience of this guide is anyone wanting to write a Windows Service, having previous experience with the .NET Framework and writing code in C#. You don’t need to have any previous experience with writing Windows Services per se. For those of you who have such experience, this guide might feel too simple for you; still, there might be some new and useful ideas to be found here even for you.

    Let’s start with the basics . We create a new Solution and Project in Visual Studio (I’m using 2008 in my examples, but this should work with 2005 or 2010 as well):

    New Project

    The “New Project” dialogue in Visual Studio

    As you see, you find the Windows Service project template under Visual C# –> Windows. You could here also choose another version of the .NET Framework, such as 2.0, if you were to install this service onto a server which limits you in terms of which version of the .NET Framework is installed.

    I prefer to set the solution name here to a the namespace “root” for the projects within this solution, and let the new project use the same namespace with “.Service” appended to it.

    When you click OK, you get a skeleton class that looks like this (Service1.cs, “View Code”):

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    
    namespace eCraft.Labs.WindowsServiceSkeleton.Service
    {
        public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
            }
    
            protected override void OnStop()
            {
            }
        }
    }

    In other words; a simple Windows Service, that doesn’t really do anything. :-)

    Now, what do we do first? Well, for starters, rename the Service1 class to something more useful. (You should really never keep the default file names such as Service1, Class1 etc. in Visual Studio, but always rename the files to something more appropriate.) If you want to make it simple, just call it “Service”. I just checked one of our own Windows Services, and it’s called just that. ;-)

    OK, the project has been created and you are now probably eager to see how you can get this program running as a Windows Service, right? Before we do so, let’s do something important first: we want to change the service’s visible name. This name is the name that will be seen in the Windows Services list (services.msc), and also something that you can refer to using the “net start/net stop” commands (more about those later). Since it becomes a bit awkward to change this name later on, it’s better to do it now, before you install the service into Windows. You find the “visible name” of the service in the “Design View” of the Service1 class (or whatever you renamed it to). Take up the Design View and look for the Properties dialogue:

    Properties

    As you see, the ServiceName is listed at the very end of this dialog. Change it to something appropriate for your specific need – I strongly recommend having a name without spaces here (the reason for this will be discussed in a later post), like WindowsServiceSkeleton in my case

    Now, it is time to compile the solution (Ctrl-Shift-B). You should now get an .exe file in the Debug folder called eCraft.Labs.WindowsServiceSkeleton.Service.exe:

    image

    The compiled results of the project.

    To get this program installed now as a service, you would do like this: Start up the Visual Studio 2008 command prompt (or whichever Visual Studio version you are using). Change to the bin\Debug directory. Your command prompt should now be something like this:

    Command Prompt

    Now, to make this service be installed into the Windows Service list, all you need to do is this:

    installutil /i <name of .exe file>

    When you run this command, the output should look something like this:

    installutil output

    Results of running installutil.

    It looks as if it has failed (“No public installers with the RunInstallerAttribute.Yes attribute could be found”), and… this is actually correct! We forgot something important: for the service to be installable, you need to have an installer class in it. Let’s go back to Visual Studio and choose “Add New Item” to our project. This time, choose this item template:

    Add New Item

    The Add New Item dialogue.

    The naming of this file is not so easy, actually. If your service is called Service.cs, two logical names would be either ServiceInstaller.cs or Installer.cs. The problem is that both of these names would cause name clashes with other classes that this class needs to use. We call it ProjectInstaller.cs for now (of course, if you called your own service class PizzaService.cs, you could always call the installer PizzaServiceInstaller.cs as well…).

    If you are an observative person, you might recognize that Visual Studio adds a reference to the System.Configuration.Install assembly when you press the Add button. This is because the ServiceInstaller class derives from a base class in that assembly.

    The code for the ProjectInstaller.cs class looks like this:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Linq;
    
    
    namespace eCraft.Labs.WindowsServiceSkeleton.Service
    {
        [RunInstaller(true)]
        public partial class ProjectInstaller : Installer
        {
            public ProjectInstaller()
            {
                InitializeComponent();
            }
        }
    }

    This will be enough to get the service installable, but… the Service itself will not be installed. This is not done automatically; we need to write installation code for it. So, we modify the file to look something like this:

    using System.ComponentModel;
    using System.Configuration.Install;
    using System.ServiceProcess;
    
    namespace eCraft.Labs.WindowsServiceSkeleton.Service
    {
        [RunInstaller(true)]
        public partial class ProjectInstaller: Installer
        {
            public ProjectInstaller()
            {
                InitializeComponent();
    
                ServiceProcessInstaller processInstaller = new ServiceProcessInstaller();
                ServiceInstaller serviceInstaller = new ServiceInstaller();
    
                // Run the service as Local System, with automatic startup. These could be modified as needed for your specific
                // service. (The account and start type can always be modified afterwards through the Windows Services MMC console;
                // these are just the defaults.)
                processInstaller.Account = ServiceAccount.LocalSystem;
                serviceInstaller.StartType = ServiceStartMode.Automatic;
                
                // This must be the same as the value we specified earlier, in the in Service.cs "Design View".
                serviceInstaller.ServiceName = "WindowsServiceSkeleton";
    
                // These are the values that will be displayed int he Windows Services MMC console.
                serviceInstaller.DisplayName = "Windows Service Skeleton";
                serviceInstaller.Description =
                    "This service acts as a Windows Service Skeleton, helping people who are learning how to write good Windows " +
                    "services.";
                
                Installers.Add(serviceInstaller);
                Installers.Add(processInstaller);   
            }
        }
    }

    (Of course, customize the DisplayName and Description the way you like.) Let’s build the solution again, and go back to our command prompt. Re-run the previous command. This time, it should work much better:

    installutil output

    The service seems to have been installed correctly. Let’s look it up in the list of Windows Services (tip: you can easily get to the list of Windows services by pressing Win-R (for “Run”), and typing “services.msc” in the textbox).

    image

    Yahoo! It’s there. Cool, huh? Let’s do one more thing before we end this Part 1 of the Windows Service series of blog postings: we start the service. This time, we make it simple (I’ll show you another way to do it in the next blog posting); we just click on the green “play” arrow in the MMC console. If all works out well, the service will now start, and the Status will be changed to “Started”. You can also look in the event log and you’ll see that the service was started:

    Event viewer 

    Well, that’s it for now! You can now stop the service in the Services MMC console.

    We have now gone through the basics of creating a fully functional (but yet meaningless, since it doesn’t do anything) Windows Service, that can be successfully installed using the installutil command. In the next blog posting, we’ll move on to make the service actually do something useful… :-) Until then, I wish you all a great Christmas holiday.

  • Andreas&#32;Finne (gravatar)

    I thought I'd spread the word about a useful, but not that well-known operator in C#; the null-coalescing operator ??.

    This is what the C# Language Reference has to say about the operator:

    "The null-coalescing operator is used to define a default value for a nullable value types as well as reference types. It returns the left-hand operand if it is not null; otherwise it returns the right operand."

    What this means is that instead of doing:

    if (x == null)
        return -1;
    else
        return x;

    You can do:

    return x ?? -1;
  • Per&#32;Lundberg (gravatar)

    Yesterday, when I was debugging a problem on an application of ours, the behavior of the application was very illogical – at least, that’s how it seemed. This is what I was doing: If a local variable (in the code-behind class for the page) was non-null, some logic where to be triggered. And this logic did not work correctly. Eventually, I simplified the program (by hardwiring stuff) to the point where it should really work. But, as you probably have figured out, it didn’t…

    Then, the answer was revealed to me; a new thought popped into my mind. The ViewState! Yes, most assuredly, this was the cause of the problem. When I set the EnableViewState=false on my control, it started working correctly again. Hallelujah! :-)

    So, what is this whole ViewState thing and why was it causing problems in my specific case?

    ViewState: The end-user experience

    You can say, without exaggerating too much, that ViewState is one of the core elements of ASP.NET. The key idea is this: imagine an .aspx file that looks like this:

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <script runat="server">
        
        /// <summary>
        /// Gets called when the Button1 is clicked.
        /// </summary>
        /// <param name="sender">the sender of the event</param>
        /// <param name="e">the event arguments</param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = "Button1 has been clicked!";
        }
    
        /// <summary>
        /// Gets called when the Button2 is clicked.
        /// </summary>
        /// <param name="sender">the sender of the event</param>
        /// <param name="e">the event arguments</param>
        protected void Button2_Click(object sender, EventArgs e)
        {
            Label1.Text += " Button2 has been clicked!";
        }
        
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <p>
                <asp:Label runat="server" ID="Label1" />
            </p>
            <asp:Button runat="server" ID="Button1" 
                        OnClick="Button1_Click"
                        Text="Button1" />
            <asp:Button runat="server" ID="Button2"
                        OnClick="Button2_Click"
                        Text="Button2" />
        </div>
        </form>
    </body>
    </html>

    (Of course, this example is fictionary; I do not recommend that you place your event handlers in the .aspx file but rather in the code-behind. :-)

    This page contains two buttons: Button1 and Button2. When rendered, it looks like this:

    Screenshot #1

    Now, if we click on the Button1, it looks like this:

     Screenshot #1

    No rocket-science yet. :-) The logic for this page can clearly be understood, without knowing how ASP.NET works “under the hood”. The button was clicked, the event was fired, and the event handler set the text of the Label1 control to “Button1 has been clicked!”. All of this happened before the page was actually rendered to the web browser.

    But now, let’s click on Button2 and see what we get:

    Screenshot #2

    Hey, that’s weird, isn’t it? In the Button2_Click() event handler, we only added the “Button2 has been clicked” text, but the “Button1 has been clicked” text still remains anyway…?

    This is where ASP.NET deviates from “regular” web programming (think: PHP, CGI, JSP…). Now, if you have only ever used ASP.NET (and never any other web-based programming environment), you might feel like this is the most natural thing in the world. It has to work like this, doesn’t it?

    Well… no. Not at all, in fact.

    ViewState: The background

    Traditionally, before the advent of ASP.NET, if you would want the state of an object (such as the content of a <span> tag) to persist across page requests, you would have to invent this yourself (There might be frameworks that can help in doing this). The default would be that all object state would “fall off” the page if the user would e.g. press F5 in the web browser.

    Now, what our friends at Microsoft has been doing is trying to bridge the gap between normal applications (i.e. Windows Forms or similar) and web applications a little. The request/response model traditionally used on the web can be a bit unfriendly to a newcomer. The ASP.NET solution to this challenge is called ViewState.

    ViewState: What is is

    So, what is this ViewState thing now that I’ve been writing about for a while? Simply put, ViewState is a functionality that lets the state of objects persist between different page requests. What you saw above, with the “Button1/2 has been clicked” texts, is a simple example of this persistence. Another simple visual example of the ViewState functionality would be to let the Button1 handler modify the background color of the page. When clicking the Button2, the modified color would still remain.

    A couple of simple rules regarding ViewState:

    • All object state gets persisted in the ViewState, for public properties (This can be seen as the general rule; there might be exceptions to it).
    • ViewState is only preserved for “server controls”; that is, any tags with the runat=”server” attribute set.
    • ViewState is enabled by default in ASP.NET. It can be disabled:
      • on control-level, by setting EnableViewState=”false”. On HTML-controls, like a regular div with runat=”server”, the attribute is called enableviewstate instead.
      • on page-level, by setting the EnableViewState=”false” attribute on the <%@ Page %> tag.
      • on application level, like this (in the Web.config):
        <system.web>
          <pages enableViewState="false"/>
        </system.web>

    Technically, the ViewState is sent in a hidden form field called __VIEWSTATE, as a string of base64-encoded text. If you like, try viewing the source of the previously listed sample page, after having clicked the Button1, and you’ll see that it contains some human-unreadable data. This data contains the “Button1 has been clicked!" text.

    Now when we have seen some of the “whys” and the “hows” for the ViewState persistence, let’s get into the even more interesting question about the problems that ViewState can cause you. I promised you at the beginning of this blog posting that it can mess up your life; you will soon see how. :-)

    ViewState: When it can cause you headaches

    As seen above, I have listed some of the advantages of preserving ViewState; it bridges the gap (slightly) between regular (Windows Forms/WPF) applications and the web. It makes the programming models more homogeneous, making it simpler for people who work with them both.

    Still, there are also some disadvantages of this technique. One of the disadvantages is that for a large page, the view state can be pretty big, meaning that quite a lot of data will be transferred over the wire on every page hit. Even though this might not be too big a problem, it can still feel meaningless to have this data being transferred when it’s not really needed (for some applications).

    Another disadvantage which was the driving reason for writing this blog entry in the first place is that the view state persistence can cause really difficult, hard-to-track bugs. The code sample below illustrates one such scenario:

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <script runat="server">
        
        // Dummy child class. In my real-world example, the class
        // has some custom behavior that justifies its existence.
        public class DropDownListCustom: DropDownList
        {
        }
        
        /// <summary>
        /// Gets called right before the page is rendered.
        /// </summary>
        /// <param name="sender">the sender of the event</param>
        /// <param name="eventArgs">the event arguments</param>
        protected void Page_PreRender(object sender, EventArgs eventArgs)
        {
            // Creates a new DropDownListCustom object with some
            // items.
            DropDownList dropDownList1 = new DropDownListCustom();
            dropDownList1.ID = "DropDownList1";
            dropDownList1.Items.Add("Item 1");
            dropDownList1.Items.Add("Item 2");
            dropDownList1.Items.Add("Item 3");
    
            if (IsPostBack)
            {
                string formValue = Request.Form["DropDownList1"];
    
                // Display the previously selected value + form
                // value so we can clearly see if the assignment
                // to the SelectedValue has any effect.
                Label1.Text = "Was selected: " + dropDownList1.SelectedValue;
                Label2.Text = "Will be selected: " + formValue;
                dropDownList1.SelectedValue = formValue;
            }
            
            div1.Controls.Add(dropDownList1);
        }
        
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">    
        <div><asp:Label ID="Label1" runat="server" /></div>
        <div><asp:Label ID="Label2" runat="server" /></div>
        <div runat="server" id="div1"/>      
        <asp:Button runat="server" ID="Button1" Text="Button1" />
        </form>
    </body>
    </html>

    When viewing this page, it looks like this:

    Screenshot #3

    When selecting a different item and clicking Button1, this is what you get:

    image

    As you see, the page is not working correctly. We selected Item 2, and it was correctly passed to the page in the Form variables, but somehow, the assignment to the SelectedValue (the highlighted line in the sample code) had no effect whatsoever.

    This sample page has some important characteristics that should be pointed out:

    1. It uses a custom DropDownList-derived class (When you change the “new DropDownListCustom” initialization to “new DropDownList”, the program works as intended, which leads me to believe that there is something special that a child-class of a System.Web.UI.WebControls class needs to do to make ViewState work correctly).
    2. It uses dynamic control creation. This is from the real-world scenario; what we do is generate the controls depending on some input data. The number of controls generated is dependent on the input data, which means that hardwiring it in the .aspx file is impossible.
    3. The initialization is only done when performing a postback (not on the initial page load). When thinking about it, this initialization shouldn’t even be necessary; the ViewState + postback handling in ASP.NET “should” be clever enough to set the default value of the DropDownList automatically. That’s how it usually work, isn’t it? But try commenting out the assignment to dropDownList1.SelectedValue and you’ll see that it makes absolutely no difference.

    Now, there are two ways to solve this:

    • Disable ViewState on the DropDownListCustom control. If the DropDownListCustom control is always (or most of the time) used in scenarios like this, you can create a constructor that sets the default value of the base.EnableViewState property to false (this is what I did). You can always reenable it for those controls that need it.
    • Move the div1.Controls.Add to line 24 in the sample (right before the “if (isPostback)”-line). This also makes it work.

    The reason why this fails is this: When adding controls dynamically, like we’re doing here, the loading of the persisted ViewState of the control being added takes place at a different stage in the ASP.NET Page Life-cycle than it would normally have taken… This, in combination with some bug/behavior when childclassing the DropDownList causes this behavior.

    One lesson learned here for me personally is that maybe ViewState shouldn’t be the default when I work on a new project. As mentioned earlier in the posting, the possibility is there to disable it in the Web.config. I don’t know if you can still re-enable it on individual pages (where it would be needed); if that’s the case, this might the optimal way to go. Then again, ViewState is extremely convenient sometimes. The bug I was fixing yesterday was actually caused by the ViewState stopping working some time ago (when introducing the DropDownListCustom). Before that, the ole’ ViewState buddy had silently been doing its job, without anybody complaining. This should be remembered when we start talking about his disadvantages. :-)

    Further reading

    Understanding ASP.NET View State: http://msdn.microsoft.com/en-us/library/ms972976.aspx
    ASP.NET Page Life Cycle Overview: http://msdn.microsoft.com/en-us/library/ms178472.aspx