Could not load type ‘System.Web.Razor.Parser.SyntaxTree.CodeSpan’ from assembly ‘System.Web.Razor

I am working with an ASP.net MVC4 project with WebAPI, and upgraded/installed a number of nuget packages (and stupidly did not test after each one). When the dust settled, I tried to load an API page in my browser and got the following error message:

“Could not load type ‘System.Web.Razor.Parser.SyntaxTree.CodeSpan’ from assembly ‘System.Web.Razor”

Eventually, I was able to resolve the error by removing the following from my web.config and app.config files:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- Begin Remove -->
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <!-- End Remove -->
  </assemblyBinding>
</runtime>

I would guess that one of the packages that I installed added this reference, which had a conflict with a different version of the same assembly in the GAC. In any event, it fixed the error (and did not cause any apparent new errors). Posting in case it may help you out with a similar error.

Force WebAPI to return JSON by Default for Html GET Requests

Currently, the default response type of for Web API requests is XML. By the time it comes out of beta, it will be the default (source - this is mentioned by Hanselman towards the end of the post). However, if you want to activate this right now, how should you do it?

Two steps:

  1. Set a JSON formatter as the first Formatter in the Web API Config Formatters collection
  2. Set “text/html” as an accepted media type for this formatter

WebAPI includes a JSON Serializer by default: DataContractJsonSerializer. However, no one wants to use it, and for good reason: lots of issues with different types, slow performance, bad date formatting and more.

Thankfully, WebAPI allows you to switch customize the data formatters used for different content types. Bloggers have recommended a number of different approaches. What seems to be the most promising is Henrik Nielsen’s JsonNetFormatter (using Json.NET to handle the JSON serialization) combined with a fix for a DateTime serialization issue (Hanselman also implies that this will be the default in post-beta WebAPI).

After you add the code for the JsonNetFormatter, you can set this up as the default Json data formatter by doing the following:

protected void Application_Start()
{
    ...

    JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
    serializerSettings.Converters.Add(new IsoDateTimeConverter());
    GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings));

    ...
}

Once you have done this, any request that comes in to the API that asks for json (setting a header to accept content of type application/json, utilizing the facility in WebAPI for content negotiation) will receive Json content formatter using the JsonNetFormatter class. However, if you want to just test this out in your browser, you will still get XML content. This is because a plan request from your browser is for type text/html, which translates to xml in the Web API universe. Though the Json will be returned automatically if you explicitly request json content (or if you use a function that requests this content type, like the $.ajax function in jQuery), if you want to test out the json in your browser, you will be out of luck using the standard configuration.

To get around this, you need to set the JsonNetFormatter to support the “text/html” media type. This will allow it to respond to requests made from the browser (and since the JsonNetFormatter is now the first Formatter in the Formatters collection, it will be used by default). You can do this as follows:

protected void Application_Start()
{
    ...

    JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
    serializerSettings.Converters.Add(new IsoDateTimeConverter());
    var jsonFormatter = new JsonNetFormatter(serializerSettings);
    jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    GlobalConfiguration.Configuration.Formatters.Insert(0, jsonFormatter);

    ...
}

Google Translating Search Queries on the Fly

The most popular post on this blog, by far, is Where Does Google Chrome Store User History, Profile and Bookmarks. I had the good luck to be the first person on the Internet to post an answer to this question (even before Google did so in their documentation), just a few days into the original Chrome Beta release. The vast majority of hits come from Google searches that include one or more of the following keywords: Chrome, History, Profile, Bookmarks, Cookies, Save.

I mention this because I saw something very interesting in my site stats today. Someone got to this page by searching for “שמירת סימניות בכרום”. This is Hebrew for “Save Bookmarks in Chrome”. If you searched for this term in English you would see a link to my post on the subject somewhere in the range of the 5th-10th link. However, they searched in Hebrew, and even so, a link to this post showed up (number 8 in the results when I tried it).

So they must be taking the Hebrew, and while they are processing results in Hebrew, the search algorithm also translates it on the fly, searches on the term translated into English, and integrates relevant English results into the result set. This is very cool, and in a world where the bulk of technical literature and answers to questions like this are in English, it is very smart. There is a good chance that someone searching for this in Hebrew will still find an answer in English to be useful. Looks like the Google Search team still has a few tricks up their collective sleeve.

Error Loading MVC 3 Project after MVC 4 is Installed or in VS 2011

Since installing the ASP.net MVC 4 Beta, it has happened to me a few times that MVC 3 websites will not load when the solution is loaded into VS 2010 (I have also read about this happening with VS 2011).

You can fix this by doing the following:

  1. In the Solution Explorer, right click on the project that wont load and click on “Edit [ProjectName].csproj”. This will open up the project definition file in VS. You can also edit this manually using your favorite text editor, opening the file through Windows Exporer.
  2. Find the line in the file that starts with ProjectTypeGuids and remove the entry “{E53F8FEA-EAE0-44A6-8774-FFD645390401}” from the list (this is code that tells Visual Studio that it is an MVC 3 project – for some reason, including this in the project file after installing MVC 4 messes things up).
  3. Save the .csproj. file and [Reload] the project through the Right Click menu in Solution Explorer.

The project should now load properly (if the MVC project has been the startup project for the solution, you may have to reset this as well).

I Love it When Technical Book Authors Have a Sense of Humor

I am going through Pro ASP.NET MVC 3 Framework by Adam Freeman and Steven Sanderson (@StevenSanderson) (Apress). Enjoying it so far – good technical writing, good level of detail mixed with useful examples of different implementation options.

And most importantly, they have a good sense of humor. From Page 381 (my highlights):

Quote from Pro ASP.NET MVC 3 (Sanderson & Freeman), page 381

If you don’t want to click on the link, they are talking about best practices for url schemas using MVC, and give an example of a link to Amazon as something not to do (I realize the irony of my linking to Amazon above). They then include in an aside:

Note To be very clear, we have only the highest respect for Amazon, who sells more of our books than everyone else combined. We know for a fact that each and every member of the Amazon team is a strikingly intelligent and beautiful person. Not one of them would be so petty as to stop selling our books over something so minor as criticism of their URL format. We love amazon. We adore Amazon. We just wish they would fix their URLs

.Another good one: The authors are talking about using MVC to create a REST API, where the same action name in a given controller can be overridden to handle HTTP Get/Post/Delete requests (page 476, my emphasis):

Now each StaffMember entity in our application can be uniquely addressed using a URL of the form Staff/123, and a client can use the GET, POST, and DELETE HTTP methods to perform operations on those addresses. This is called a RESTful API, except by people who claim to be experts in REST, who will tell you that nothing is truly RESTful except their own code. (We joke—sort of).

Gotta love it.

Crucible Code Review Wishlist

I have been trying out Crucible Code Review software from Atlassian (halfway through the trial) with a number of teams in my department. The competition in this area is pretty sparse, and each one has its other issues:

  • Kiln only works for Mercurial (which we may move to some day, but for now we are using SVN so we need a solution that works with that as also)
  • Review Board seems to be very popular, but just looking at the list of the dependencies gives me indigestion when considering an install on our Windows Server environment.
  • Code Collaborator is way too expensive without giving much extra (50 users in Crucible = $2200, 50 named users in Code Collaborator = $24,450)
  • Code Review Tool doesn’t have a very professional looking site, hardly any documentation and no plugin potential and no Mercurial support
  • Specatare‘s and Parasoft‘s websites are even sparser and gives almost no info (aside from a few screenshots) – not enough to make me spend the time trying it out.

On the other hand, thus far Crucible has delivered on the main functionality: establishing a medium for easily performing code reviews. The price is very fair and there is very decent documentation. We will probably go with it, just for those reasons alone.

That said, I have a number of issues with Crucible – posting them here in the hopes that someone from Atlassian will see this and can do something about some or all of them. (more…)