Kevin Isom

Just a good ol' boy, by-God Virginia-proud and country-sophisticated -- sort of like a John Deere tractor with air conditioning and satellite radio.

I've been doing a lot of REST based services lately and for something that is as simple a concept as REST it is actually not the easiest thing to find guidance for a .Net developer. It's simple, or at least it should be. My first stop was the WCF Rest Starter Kit. I thought great, surely this would get me going with no fuss. I only wish it were so. I thought I could create a project with it and just get going. Instead what I got was a whole heap of code that didn't really start me on the way at all. I won't totally bag on the starter kit. I rather like the items around the atom publishing protocol. I briefly considered just writing an http handler for that but I knew that there had to be a better way.

Enter WCF.

It is actually incredibly easy to write REST services in .net. with WCF. 

Step 1

Create a new WCF service  in your website.

Step 2

Go to the cruft VS adds to your Web.config when creating your service and remove it and replace it with the following

   1:  <system.serviceModel>
   2:      <behaviors>
   3:          <endpointBehaviors>
   4:              <behavior name="web">
   5:                  <webHttp/>
   6:              </behavior>
   7:          </endpointBehaviors>
   8:      </behaviors>
   9:      <services>
  10:          <service name="Service">
  11:              <endpoint address=""
  12:                    binding="webHttpBinding"
  13:                    contract="IService"
  14:                    behaviorConfiguration="web"/>
  15:      </service>
  16:      <service name="WebsiteService">
  17:          <endpoint address=""
  18:                   binding="webHttpBinding"
  19:                   contract="WebsiteService"
  20:                   behaviorConfiguration="web"/>
  21:          </service>
  22:      </services>
  23:  </system.serviceModel>


And all you have to do it is add some attributes to your service contract

   1:  using System.ServiceModel;
   2:  using System.ServiceModel.Web;
   3:   
   4:  [ServiceContract]
   5:  public interface IService
   6:  {
   7:      [OperationContract]
   8:      [WebGet(UriTemplate = "/SayHello", ResponseFormat = WebMessageFormat.Xml)]
   9:      string SayHello();
  10:   
  11:      [OperationContract]
  12:      [WebGet(UriTemplate = "/SayHello/{user}", ResponseFormat = WebMessageFormat.Xml)]
  13:      string SayHelloToUser(string user);
  14:   
  15:      [OperationContract]
  16:      [WebGet(UriTemplate = "/SayHelloInJson/{user}", ResponseFormat = WebMessageFormat.Json)]
  17:      string SayHelloToUserInJson(string user);
  18:   
  19:      [OperationContract]
  20:      [WebGet(UriTemplate = "/GetPackage", ResponseFormat = WebMessageFormat.Json)]
  21:      Package GetPackage();
  22:   
  23:   
  24:      [OperationContract]
  25:      [WebInvoke(Method = "POST", UriTemplate = "/PlainPost", ResponseFormat = WebMessageFormat.Xml,
  26:          BodyStyle = WebMessageBodyStyle.Wrapped)]
  27:      int PlainPost(string username, string name, string message);
  28:   
  29:  }

Then implement the interface and you are good to go. I'll cover consuming these with both .Net and Javascript in a later post.

The attributes are where the real magic happens

The WebGet attribute tells WCF that this method is invoked via an HTTP Get Request.

The UriTemplate attribute property sets the URI of the call so on SayHello the url requested would be ~/Service.svc/SayHello

The ResponseFormat attribute property tells the service to return either XML or Json depending on the value of the WebMessageFormat enum

The WebInvoke attribute gives you to specify the type of HTTP request you make. The default method is POST.

The BodyStyle attribute property sets the body style of the messages sent to and from the service.

There you have it. Simple REST from WCF.

Cheers

Posted by kevinisom | 4 comment(s)
Filed under: , ,

I have mentioned previously some useful tools for web development for IE, and now here are a couple more.

DOM Helper

CropperCapture[16]

This allows you to edit the css of a page much like EditCSS for Firefox

Fiddler

From the site

"Fiddler is a HTTP Debugging Proxy which logs all HTTP traffic between your computer and the Internet. Fiddler allows you to inspect all HTTP Traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler includes a powerful event-based scripting subsystem, and can be extended using any .NET language."

CropperCapture[17]

A cool feature of Fiddler is the ability to write extensions for it. Definitely worthy looking into

Delicious

And not development related but damn useful (finally) is the Delicious plugin for IE. I have a tonne of bookmarks, keeping them synced between browsers and machines used to be a nightmare. Now I just use Delicious for IE and Firefox on all my machines and my problem is solved....Now if I could just cull some of my 2456 links I have saved I'd be alright.

Posted by kevinisom | with no comments
Filed under: ,

How often have you seen code like this?

   1:  string myAppSetting = ConfigurationManager.AppSetting["key"];
   2:  if(myAppSetting==null)
   3:       myAppSetting = "MyDefaultSetting"

Or worse yet not even do the check, then during the deploy process the appsetting doesn't get copied over to the instance and you get a null reference exception. That is not a good look.

That sucks. But is preventable in code. That's when the null coalescing operator(??) comes in handy.

Example:

   1:  string myAppSetting = 
   2:            ConfigurationManager.AppSetting["key"] ?? "MyDefaultSetting"
And that's it. A very easy way to prevent errors after deployment. Of course it's useful in other scenarios as well
 
Now the story in VB isn't nearly as nice
 
   1:  Dim myAppSetting As String = IIf(ConfigurationManager.AppSetting("key") Is Nothing, _
   2:  "MyDefaultSetting", ConfigurationManager.AppSetting("key"))
There is a gotcha with IIF as well because it's a function and not a language feature.
 
Anytime you can code to prevent error's  and keep the application working it's a win. Of course make note that the default value you set could cause other errors so use appropriately.
Posted by kevinisom | with no comments
Filed under: ,

I hate it when I forget something. I had one of the guys on my team today asked me how to invoke a web service remotely as he was getting an error. Well I knew right away what the problem was. But could remember the solution so I had to look and now I'm gonna put it here so it'll be easier to find next time.

   1:  <system.web>  
   2:      <webServices>
   3:          <protocols>
   4:              <add name="HttpGet"/>
   5:              <add name="HttpPost"/>
   6:          </protocols>
   7:      </webServices>
   8:  </system.web>  

Now I don't recommend this for production, but it's pretty useful for testing.

Posted by kevinisom | 1 comment(s)
Filed under: , ,

Firebug rocks. Nothing, I mean nothing beats it for debug web pages. But what do you do for problems specific to IE (most notably IE 6) Here are a list of tools I use to help cause telling the user to get a real browser is not a solution

Internet Explorer Developer Toolbar

This toolbar provides some of the features of firebug.
CropperCapture[2]

XRAY

Is a bookmarklet that let's you see information about elements on a page.
CropperCapture[3]

Companion.JS

An javascript debugger for IE
CropperCapture[4]

This may not be free in the future. Debug Bar from the same guy is also a very useful tool, but it's not free for professional use but probably worth the 59 euro if you do a lot of work with IE.

And finally something while not useful for debugging but damn useful in its own right is the Inline Search for IE.

CropperCapture[5]

Hope this helps somebody out.

Posted by kevinisom | 1 comment(s)
Filed under: ,

There I said it.

I'm a C# guy. Now about 4 years when I started with .Net I started writing in VB.Net but I quickly decided to move C#. This, despite having spent the 3+ years prior working in ASP Classic. After a little bit of C# I quickly adopted the typical C# snobbish opinion of VB. For no good reason mind you, just cause it was different.

My how things change.

I've joined a VB team and instead of trying to make the team change to C# I figured I'd just get back to VB. Also we do a lot of work with XML so it got me looking into the VB 9.0 XML features and I found that you can do things like this:

   1:  Imports <xmlns:ns="http://contacts">
   2:   
   3:  Dim contact1 As XElement = _
   4:      <contact>
   5:        <name>Joe Bloggs</name>
   6:        <phone type="home">09-555-0144</phone>
   7:        <phone type="mobile">021-555-0145</phone>
   8:      </contact>

Okay, nifty and all, but what do you do from there...How about this?

   1:  Dim phoneTypes As XElement = _
   2:    <phoneTypes>
   3:        <%= From phone In contacts...<phone> _
   4:            Select <type><%= phone.@type %></type> _
   5:        %>
   6:    </phoneTypes>

And that will give you the following XML

<phoneTypes>
    <type>home</type>
    <type>mobile</type>
</phoneTypes>

That's rather cool and really useful with some of the stuff I'll be working on.

Check out the Overview of LINQ to XML in Visual Basic for more details

Now, I still want to say I'm a C# guy, but I think the snickering at the mention of VB stops now. 

Posted by kevinisom | with no comments
Filed under: , , ,

I like the NUnit 2.4 Constraint based syntax. So In my new role I am having to implement Unit Testing so I decided on going with NUnit to begin with despite my preference for MbUnit. But once I got started writing my tests, I discover Is is a keyword in VB (I'm more of a C# person, but hey I'm no language bigot). I kinda freak out a little. Did I do something wrong? Forget to add something? Google a bit and still no joy. Then I remember the code examples installed with NUnit and have a look and what do you know? Is is now Iz in VB. Not exactly as clear as Is but you gotta do what you gotta do. So now in VB a Unit Test looks like this

   1:  Imports NUnit.Framework
   2:  Imports NUnit.Framework.SyntaxHelpers
   3:  <TestFixture()> _
   4:  Public Class MyVIsualBasicSampleTests
   5:   
   6:      <Test()> _
   7:      Public Sub TestBlankForSyntax()
   8:          Assert.That(something.IsSomething(), Iz.False)
   9:      End Sub
  10:   
  11:      <Test()> _
  12:      Public Sub AnotherSampleTestForSomethingElse()
  13:          Assert.That(something.IsSomethingElse(), Iz.True)
  14:      End Sub
  15:   
  16:  End Class

And there you go.

So, I'm working on a Web Application Project in Visual Studio 2008 and I realize I don't have a strongly typed Profile object...So I Google around and find that this a Problem in Visual Studio 2005 and that Microsoft didn't fix the problem in VS 2008. Needless to say I was a little unimpressed. But I also found the Web Profile Builder at the MSDN Code Gallery. I followed the instructions here and was away running.

Posted by kevinisom | with no comments
Filed under: , ,

Had a instance where I needed to close the Popup Control with JavaScript

   1:  <ajax:PopupControlExtender ID="pceShowPanel" runat="server"
   2:      TargetControlID="showPanel"
   3:      PopupControlID="popupPanel" 
   4:      BehaviorID="popupBehavior"                 
   5:      />

So with that on your page just hide it with hidePopup().

   1:  function Hide(){
   2:      $find('popupBehavior').hidePopup()
   3:  }

Of course you can show the popup as well with the showPopup() method. The real trick here is the $find shortcut method. The FindComponent method does just that and get's the component in this case the PopupExtender and allows you to call the methods associated with that control.

Tedious coding sucks. SubSonic saves lots of time. But I want it to save me more. So I've started working on a method that will fill out the controls for me so I don't have to. It's simple really. I just new() up a the model I will use and pass it to my method along with the UserControl I have my form elements in.

   1:  public void SetupForm<T>(Control form, T activeRecord ) 
   2:      where T : AbstractRecord<T> ,new()
   3:  {
   4:      TableSchema.TableColumnSettingCollection settings = activeRecord.GetColumnSettings();
   5:      foreach (TableSchema.TableColumnSetting setting in settings)
   6:      {
   7:          Control settingControl = form.FindControl(setting.ColumnName);
   8:          if (settingControl is TextBox)
   9:              ((TextBox)settingControl).Text = 
  10:                  activeRecord.GetColumnValue<string>(setting.ColumnName);
  11:          if (settingControl is DropDownList)
  12:              ((DropDownList)settingControl).SelectedValue = 
  13:                  activeRecord.GetColumnValue<string>(setting.ColumnName);
  14:      }
  15:  }

The key thing is to make sure you have called EnsureChildControls() before calling this method.

So in my control the code looks like

   1:  int issueId = SubSonic.Sugar.Web.QueryString<int>("issue");
   2:  if (issueId != 0)
   3:  {
   4:      EnsureChildControls();
   5:      Issue issue = new Issue(issueId);
   6:      //BasePage inherits from System.Web.UI.Page
   7:      BasePage.SetupForm(this, issue);
   8:  } 

Now this is pretty rough and more than anything a proof of concept so your mileage may vary. But I figure this is a good place to start

kick it on DotNetKicks.com
Posted by kevinisom | 6 comment(s)
Filed under: , ,
More Posts Next page »