Of Code and Me

Somewhere to write down all the stuff I'm going to forget and then need

Flush SQL Server query cache (for benchmarking) April 20, 2010

Filed under: Search Server — Rupert Bates @ 2:45 pm

dbcc dropcleanbuffers
dbcc freeproccache


links for 2010-04-15 April 15, 2010

Filed under: Uncategorized — Rupert Bates @ 10:04 pm

Svn integration for notepad++

Filed under: Uncategorized — Rupert Bates @ 11:13 am

Download, unzip and copy the binary to your notepad++\plugins directory (probably C:\Program Files\Notepad++\plugins)


Setup Apache on Ubuntu April 8, 2010

Filed under: Linux,Systems Administration,Web — Rupert Bates @ 4:21 pm

Go to System -> Administration -> Synaptic Package Manager

Find the apache2 package (using the quick search is the easiest way), click ‘Mark for installation’ and then click the ‘Apply’ button

When the install is completed check that:

  1. the Apache program files are in /etc/apache2/
  2. there is an index.html file in /var/www/ (this is the root of the default vhost)
  3. apache2 is running, the command: ps -A | grep apache2 should return at least 1 result
  4. browsing to http://localhost/index.html serves that file successfully (I needed to restart it after the install before I could browse to localhost)

To start, stop and restart Apache :
/etc/init.d/apache2 start
/etc/init.d/apache2 s
/etc/init.d/apache2 restart


Donut caching in asp.net mvc 2 with Html.Action

Filed under: Asp.Net,C#,MVC,Uncategorized,Web — Rupert Bates @ 11:22 am

[Update – ok, so this officially doesn’t work, which sucks. I’m having a look at alternatives, but at the moment it looks like that is going to be reverting to MVC 1.0]

To do donut caching in Asp.Net Mvc 1.0 required quite a bit of hacking (or at least that was the only way I could get it to work), but with version 2 things get much better because of the addition of the Html.Action method.

As a quick recap, ‘donut caching’ is when you cache the whole of a web page except for small parts within it – the holes in the donut. A classic use for it is pages which have some personalised aspect like a logged in user name but are otherwise identical for all users.

To solve exactly this scenario I used the following code:

A child action called LoggedInUserInfo in my HomeController

        public ActionResult LoggedInUserInfo(HttpContextBase context)
            return View(context);

with a view of the same name:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<HttpContextBase>" %>
<%@ Import Namespace="KableDirect.Service" %>
<%@ Import Namespace="KableDirect.Web.FrontEnd.Models.Shared"%>

        <li>You are logged in as <%= Model.User.Identity.Name %> </li>

        <li><%=Html.ActionLink("My Profile", "Profile", "Account")%></li>

        <%if (Model.User.IsAdmin()){%>
        <li><a href="<%= RouteHelper.GetAdminUrl(Model)%>">Admin</a></li>
        <li><%=Html.ActionLink("Logout", "Logoff", "Account")%></li>

I also have the following HtmlHelper method to make calling the asp.net WriteSubstitution() method easier:

    public delegate string MvcCacheCallback(HttpContextBase context);
    public static class CacheHelper
        public static object Substitute(this HtmlHelper html, MvcCacheCallback cb)
            html.ViewContext.HttpContext.Response.WriteSubstitution(c => cb(new HttpContextWrapper(c)));
            return null;

Now I can call my child action within my MasterPage using Html.Action as follows:

<%=  Html.Substitute(context => Html.Action("LoggedInUserInfo", "Home", new {context}).ToString()) %>

It is important that your action takes the context as a parameter or it will only be called once the first time the page is hit and then get cached along with everything else.
It is also important that you have a route in your route table that will catch the {controller}/{action} url pattern. See this post for more details.

Phill Haack now has a warning on his site about problems with donut caching in Asp.Net Mvc 2, but this has worked fine for me, I’ll update here if I find scenarios where this doesn’t work.

There is a good introduction to Html.Action here.


Error: No route in the route table matches the supplied values when using Html.Action or Html.RenderAction in Asp.Net MVC April 6, 2010

Filed under: Asp.Net,Error,Web — Rupert Bates @ 4:20 pm

I ran across this error today when using the new Html.Action:

System.InvalidOperationException: No route in the route table matches the supplied values.

It turns out that Action and RenderAction require there to be a default route to catch the {controller}/{action} pattern.

So adding this into the RegisterRoutes method fixed the problem:

                    controller = "Home",
                    action = "Index"