Of Code and Me

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

New .Net Client Library for Guardian Open Platform November 26, 2009

Filed under: Asp.Net, C#, Web, guardian.co.uk — Rupert Bates @ 10:30 am

I’ve recently created a .Net client library for the Guardian’s Open Platform API which allows you to query guardian.co.uk, pull back content and ‘Build applications with the Guardian’.

The project is open source and hosted on codeplex.

You can find out more about the Open Platform API here:

http://www.guardian.co.uk/open-platform

 

Use CacheProfile attribute with output caching in asp.net mvc November 22, 2009

Filed under: Asp.Net, C#, MVC, Web — Rupert Bates @ 9:21 pm

I’ve recently been setting up some caching on a new Asp.Net MVC site by using the OutputCache attribute on my controllers:


//cache this for an hour
 [OutputCache(Duration=60 * 60, VaryByParam="")]

This works really well except that it means hard codeding the cache time into my app so if I want to change it I need to recompile and deploy my code which is obviously far from ideal. So I changed my code to load the value from the web.config and ran into this error:

‘An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type’

Not very helpful.

But fortunately there is a better way of doing all this using cache profiles, I just set up a cache profile in my web.config:


<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="HomePage" duration="3600" varyByParam="None" location="ServerAndClient"/>
</outputCacheProfiles>
</outputCacheSettings>

</caching>

</system.web>

And then reference this in my attribute:

 [OutputCache( CacheProfile="HomePage")]

And bingo, we’re sucking diesel as a friend of mine says!

 

Create an Asp.Net MVC HtmlHelper for use in unit tests November 17, 2009

Filed under: Asp.Net, C#, Coding, MVC, Web — Rupert Bates @ 5:47 pm

Here’s a utility factory class to create an HtmlHelper instance so that you can unit test extension methods written on it. It will take a controller and a model for methods which rely on those. I adapted it from this post, and changed it to work with Asp.Net version 1.0 and to accept a model.


class HtmlHelperFactory
 {
 public static HtmlHelper CreateInstance(RouteData route, Controller controller)
 {
 return CreateInstance(route, controller, null);
 }
 public static HtmlHelper CreateInstance(RouteData route, Controller controller, object model)
 {
 HttpContextBase httpContext = new HttpContextDummy();

 var cc = new ControllerContext(httpContext, route, controller);
 var vd = new ViewDataDictionary(model);
 ViewContext vc = new ViewContext(cc, new ViewDummy(), vd, new TempDataDictionary());
 return new HtmlHelper(vc, new ViewDataContainerDummy(vd), new RouteCollection());
 }

 // Dummy classes needed to be able to create HtmlHelper

 private class HttpRequestDummy : HttpRequestBase
 {
 public override string ApplicationPath
 {
 get { return ""; }
 }

 public override string AppRelativeCurrentExecutionFilePath
 {
 // Any shorter string here gives exception:
 // index larger than length of string
 get { return "~/"; }
 }

 public override string PathInfo
 {
 get { return ""; }
 }
 }

 private class HttpResponseDummy : HttpResponseBase
 {
 public override string ApplyAppPathModifier(string virtualPath)
 {
 return virtualPath;
 }
 }

 private class HttpContextDummy : HttpContextBase
 {
 public override HttpRequestBase Request
 {
 get { return new HttpRequestDummy(); }
 }

 public override HttpResponseBase Response
 {
 get { return new HttpResponseDummy(); }
 }
 }

 private class ViewDummy : IView
 {
 public void Render(ViewContext viewContext, System.IO.TextWriter writer)
 {
 throw new NotImplementedException();
 }
 }

 private class ViewDataContainerDummy : IViewDataContainer
 {
 public ViewDataContainerDummy()
 {
 }

 public ViewDataContainerDummy(ViewDataDictionary dataDictionary)
 {
 _data = dataDictionary;
 }

 private ViewDataDictionary _data;
 public ViewDataDictionary ViewData
 {
 get { return _data; }
 set { _data = value; }
 }
 }
 }

 

 

Where do websites go when they die? February 8, 2008

Filed under: Bikes, Web — Rupert Bates @ 11:03 am

Or more accurately when the people that create and maintain them die. I was thinking about this this morning when I read about of the sad death of Sheldon Brown. Sheldon Brown was what you might call a ‘bicycle evangelist’ from Massachusetts, and his site is a treasure trove of information for the cycle enthusiast or just for someone trying to carry out routine maintenance. I often find myself there when I need to work out how to, for instance, use a cone wrench correctly.

And this is the real point of this post, what now happens to this site which is a sizable and valuable body of work? Before the world wide web this content might have ended up in a book, the ultimate redundant data repository, thousands perhaps millions of extremely durable, geographically dispersed copies. Even when a book goes out of print there will be copies around in specialist libraries for hundreds perhaps thousands of years, but with a website if you switch of the server, or delete the files that’s it. Gone.

I hope this doesn’t happen to Sheldon Brown’s site, as it is an impressive and fitting legacy.