Tips for Updating From WebAPI Beta to WebAPI RC

Published on Friday, June 1, 2012

I just installed VS 2012 RC (previous codename VS11) to make sure I am on the latest and greatest and I'd like to mention a few gotchas I ran into along the way while upgrading Keep Track of My Games.

Nuget Packages

One of the first things I did when opening the solution was to compile and run. WHAM. You will get a MissingMethodException:

[MissingMethodException: Method not found: 'Void System.Net.Http.Headers.HttpHeaders.AddWithoutValidation(System.String, System.Collections.Generic.IEnumerable`1<System.String>)'.]
   System.Web.Http.WebHost.HttpControllerHandler.AddHeaderToHttpRequestMessage(HttpRequestMessage httpRequestMessage, String headerName, String[] headerValues) +0
   System.Web.Http.WebHost.HttpControllerHandler.ConvertRequest(HttpContextBase httpContextBase) +248
   System.Web.Http.WebHost.HttpControllerHandler.BeginProcessRequest(HttpContextBase httpContextBase, AsyncCallback callback, Object state) +79
   System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +268
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

First issue: Web API had also been updated along with VS 2012's install. That means your previous beta Nuget packages are out of date. Unfortunately, if you go into Manage Nuget Packages you'll find no help in the Updates panel.

Turns out, the IDs have changed! Search for Microsoft.AspNet.WebApi and you'll find the RC packages again. In my solution, I am using:

  <package id="Microsoft.AspNet.Mvc" version="4.0.20505.0" />
  <package id="Microsoft.AspNet.Razor" version="2.0.20505.0" />
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20505.0" />
  <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20505.0" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.20505.0" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.20505.0" />
  <package id="Microsoft.Net.Http" version="2.0.20505.0" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" />

Once you uninstall your beta packages and install the new RC, you will likely run into a few more issues...

Dependency Injection

I am using Ninject for dependency injection. You will need to adapt this solution to your needs if you aren't using Ninject. You will need to use a new way of setting the DependencyResolver, see this GitHub source repository: https://github.com/filipw/Ninject-resolver-for-ASP.NET-Web-API

Thanks Filip!

No more generic HttpResponseMessage

If you had previously been using code like this:

new HttpResponseMessage<T>(someValue)

You will get compilation errors. The new way to handle this is via the Request property in your controllers:

Request.CreateResponse(HttpStatusCode.OK, result);

You will need to change any return types from HttpResponseMessage<T> to HttpResponseMessage.

No need for custom JSON.NET formatter

If you had previously been using a variant of Rick Strahl's JSON.NET formatter, you do not need it anymore as Web API defaults to JSON.NET now. However, if you, like me, want to customize the settings used, you can still do so:

Global.asax or App_Start

var formatter = GlobalConfiguration.Configuration.Formatters.OfType<JsonMediaTypeFormatter>().First();
formatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
formatter.SerializerSettings.Converters.Add(new StringEnumConverter());

Thanks to Matt in the comments for trimming the fat off what I had previously.

No more GetUserPrincipal

I had previously been using the extension method GetUserPrincipal in my custom Authorize attribute. No more! You can now use System.Threading.Thread.CurrentPrincipal.Identity if you need the current principal in Web API. There's also a convenient User property in the ApiController base class.

That's it!

That's about all I ran into. I am also happy to report that AttributeRouting still seems to work fine against the Web API RC and MVC 4 RC! I did some limited browsing around on my site with heavy AJAX calls and everything seemed to work.

Hope this saves you some time!

About Kamran
Hi, I'm a professional full-stack developer who also loves to write, speak at conferences, work on side projects, contribute to open source, make games, and play them.
comments powered by Disqus
comments powered by Disqus