Wednesday, April 30, 2014

Application Insights and Sharepoint: not a good combination

After installing the Application Insights Monitoring Agent on one of our Application Servers, users started to complain that the Sharepoint environment running on the same machine became very slow.

When looking inside the Event Log on the server, we found a lot of errors similar to the following:

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2

Faulting module name: ntdll.dll, version: 6.1.7601.18247, time stamp: 0x521eaf24

Exception code: 0xc0000374

Fault offset: 0x00000000000c4102

Faulting process id: 0x10e8

Faulting application start time: 0x01cf4838c2e39a9a

Faulting application path: c:\windows\system32\inetsrv\w3wp.exe

Faulting module path: C:\Windows\SYSTEM32\ntdll.dll

Report Id: 5fce3de2-b42c-11e3-9d78-005056924d03

The MSDN forums and the Connect site brought some answers to this issue and linked the issue to our recently installed Monitoring Agent. And indeed after removing the Monitoring Agent, the issue was gone…

In the meanwhile a new version of Application Insights agent got released that will hopefully contain a fix(I still have to test it myself).

Tuesday, April 29, 2014

MongoDB error: An error occurred while deserializing the _id field of class … : Cannot deserialize string from BsonType ObjectId.

The last few weeks I’m having fun learning MongoDB. Having some experience with RavenDB, I hoped to re-use most of knowledge when building a MongoDB backend. However I have to conclude that no two No-SQL solutions are alike, so there is still a high learning curve.

I created a sample application, but when I tried to load some objects from the database, I got the following error:

An error occurred while deserializing the _id field of class Product: Cannot deserialize string from BsonType ObjectId.

Let’s have a look at the object I was using; I have a Product class with 2 properties and an ‘_id’ field. The ‘_id’ field is automatically generated by MongoDB for every object you create.

The problem is that behind the scenes MongoDB is storing all objects as BSON documents in the database. The ‘_id’ field isn’t an ordinary string but an ObjectId, a 12-byte BSON type, constructed using:

  • a 4-byte value representing the seconds since the Unix epoch,
  • a 3-byte machine identifier,
  • a 2-byte process id, and
  • a 3-byte counter, starting with a random value.

To fix our error, we have to update our Product class to use the ObjectId type:

Monday, April 28, 2014

Nice quote

“XML is like violence: If it's not working, you aren't using enough of it.”

Friday, April 25, 2014

Impress your colleagues with your knowledge about... the gcServer config option

Sometimes when working with .NET you discover some hidden gems. Some of them very useful, other ones a little bit harder to find a good way to benefit from their functionality. One of those hidden gems that I discovered some days ago is the gcServer config option.

What I didn’t know is that there are actually two kinds of Garbage Collectors available in .NET, the Workstation GC and the Server GC.

From the MSDN site:

The garbage collector is self-tuning and can work in a wide variety of scenarios. You can use a configuration file setting to set the type of garbage collection based on the characteristics of the workload. The CLR provides the following types of garbage collection:

  • Workstation garbage collection, which is for all client workstations and stand-alone PCs. This is the default setting for the <gcServer> element in the runtime configuration schema.

    Workstation garbage collection can be concurrent or non-concurrent. Concurrent garbage collection enables managed threads to continue operations during a garbage collection.

    Starting with the .NET Framework 4, background garbage collection replaces concurrent garbage collection.

  • Server garbage collection, which is intended for server applications that need high throughput and scalability. Server garbage collection can be non-concurrent or background.

You can use the <gcServer> element of the runtime configuration schema to specify the type of garbage collection you want the CLR to perform. When this element's enabled attribute is set to false (the default), the CLR performs workstation garbage collection. When you set the enabled attribute to true, the CLR performs server garbage collection.

Thursday, April 24, 2014

Import a TFS 2008 collection in TFS 2012

With the change from TFS 2008 to TFS 2010, with the introduction of the TFS collections, Microsoft completely reorganized the database structure. This makes it impossible to just attach your TFS 2008 databases to an existing TFS 2010/2012 environment. You can not attach a collection as the concept of a collection didn’t exist yet in 2008.

So how can we fix this?

Luckily Microsoft did all the work for us and introduced a command line option in TFSconfig to import an old TFS 2008 database and attach it as a new collection.

  • Export the TFS 2008 databases
  • Import the databases to the database server that you use for your TFS 2012 instance
  • Log on to your TFS 2012 application server
  • Open a command prompt(run as an administrator)
  • Go to the TFS tools directory: c:\program files\Microsoft Team Foundation Server 11.0\Tools
  • Run the tfsconfig command with the following options:
    • tfsconfig import /SQLInstance: <instancename> /CollectionName: <new collectionname> /confirmed

clip_image002[5]

  • This will start the upgrade process. Be patient as this can take some time.

clip_image002[7]

  • When everything ran successful, you should see a message telling you there are 0 errors and 0 warnings.

clip_image002

Wednesday, April 23, 2014

.NET Universe Poster 2013

Looking for an overview of the .NET framework showing the main .NET SDKs, libraries and packages classified by application type and package type? Microsoft created the .NET Universe Poster(deserves a place in every developer’s bedroom Glimlach).

From the download page:

This poster shows how the trends are changing in .NET as we´re moving from a single large .NET Framework to a more loosely coupled and autonomous libraries and sub-frameworks, many of them even published as NuGet packages and evolving continuously. The number of those libs and packages is evolving and growing, so having a visual photo of it can be helpful. The main idea of the poster is to show that you can create any kind of application with .NET, from the largest applications to the smaller apps: in the cloud, on the web, on desktops, tablets, phones, and in embedded environments (even watches!). Any of those application types is shown as category/bucket in the poster and within each bucket we´re tossing the main libraries/SDKs/packages out. Then we´re also showing cross-cutting concerns buckets like Security, Data Access, and .NET Extension libs. The main categories are the following: - Emerging application patterns (Mobile, Web & Cloud) - Established application patterns (Desktop and Embedded) - Cross-Cutting concerns Finally, the poster is putting a check/mark on every lib/SDK bullet depending if they are or not complaint with the following: - NuGet package - Open Source - Microsoft Official Supported You can print it out or use it as in electronic format (.PDF). Using the electronic format (.PDF) allows you to access each content URL/page related.

image

Tuesday, April 22, 2014

TFS Git: Sync button not enabled

For a project I’m using the TFS Git integration. After creating a local branch and committing some changes, I couldn’t sync my changes to the remote TFS repo. The ‘Sync’ button was disabled on the Unsynced Commits screen.

clip_image002

The reason the ‘Sync’ button was disabled is that although I had the branch created locally, this branch didn’t exist yet on the remote TFS repo. I had to create this branch first. This is not possible from inside Visual Studio (yet).

So you have to go to a command prompt and execute the following command to push the current branch and set the remote as upstream:

git push --set-upstream origin new_branch

Friday, April 18, 2014

C# Brainteasers

Looking for some brain gymnastic before starting the weekend? Have a look at Sunny Ahuwanya's C# brain teaser:

I have to admit that I had most of them wrong Verwarde emoticon. It seems there are some dark corners and edge cases in C#…

Go check them out!

Wednesday, April 16, 2014

MongoDB: System error 1067 has occurred.

After installing MongoDB as a windows service I wasn’t able to get it started. Instead the following error message was shown:

The Mongo DB service is starting.

The Mongo DB service could not be started.

A system error has occurred.

System error 1067 has occurred.

The process terminated unexpectedly.

When MongoDB crashes like this, you have to do some clean up work before trying to start it again:

  • Delete the following file inside the /data/db/ directory: mongod.lock
  • mongod.exe –repair
  • Start the mongod service again

Tuesday, April 15, 2014

TypeScript error: Initializer of instance member variable cannot reference identifier declared in the constructor.

In a TypeScript application we are building, we have code similar to the following:

However when we try to run this, TypeScript complains with the following error message:

Error      19           Initializer of instance member variable 'processAllOrders' cannot reference identifier 'that' declared in the constructor.             

I think it’s a bug in TypeScript as I don’t see any reason why this shouldn’t work.

Monday, April 14, 2014

Error in Visual Studio 2013 when creating a new project: “No exports were found that match the constraint"

After installing some updates, my Visual Studio went bananas. When I try to create a new project, it always fails with the following error message:

No exports were found that match the constraint:
ContractName
Microsoft.VisualStudio.Text.ITextDocumentFactoryService
RequiredTypeIdentity
Microsoft.VisualStudio.Text.ITextDocumentFactoryService

No idea what’s causing the issue, but I was able to fix the issue based on the workaround mentioned on the Connect site:

  • Delete the ComponentModelCache folder at %AppData%\Local\Microsoft\VisualStudio\12.0.

Friday, April 11, 2014

Dojo: Esri.request is undefined

On a Single Page Application we are building, we use the ArcGIS API for JavaScript.  This API allows us to bring the power of the ArcGIS GIS functionality into our client application. The ArcGIS API for JavaScript is build on top of the popular Dojo toolkit. This means that we had to integrate Dojo inside our application.

So we added a Dojo config file to our application:

However when we ran the application and tried to load a Dojo module, it failed with the following error message:

Esri.request is undefined

It took us some time to figure out that the issue was related to one specific setting inside our DojoConfig; the async setting. If async is set to true, injected modules will be loaded when require is called. If async is not set, these modules are loaded immediately when dojo.js is loaded.

So to fix it, we updated the Dojo config to:

Thursday, April 10, 2014

The remote certificate is invalid according to the validation procedure

When calling an OData service from inside my ASP.NET MVC application, the call always fails with the following exception:

The remote certificate is invalid according to the validation procedure

The OData service I’m connecting to is available through HTTPS so I would guess that something is wrong with the SSL certificate.

Let’s walk through the checklist:

  • Hostname matches the name used in the certificate: OK
  • Certificate is not expired: OK
  • Encryption level is high enough: OK
  • The full certificate chain is trusted: OK

Mmm, strange. Everything seemed fine. And when I browsed to the OData service directly from the browser, I could get all the data as I would expect.

In the end I figured out that I had to give the MVC application access to the private key of the certificate.

Following steps fixed the problem:

  1. Export the certificate from the OData Service host(don’t forget to export the private key as well).
  2. Open MMC and load the Certificates snap-in.
  3. Import the certificate into the "Local Computer" account on the server where the ASP.NET MVC application is hosted.  Make sure to check "Allow private key to be exported"
  4. Give your IIS 7.5 Application Pool's identity Full Trust access to the certificate.

Wednesday, April 9, 2014

Nice Visual Studio Add-in: File nesting

File Nesting is a feature in Visual Studio that was available for a long time. It allows you to put multiple files together under one ‘root’ file. This is a feature you’ve certainly seen in WinForms(designer generated code and codebehind), ASP.NET WebForms(HTML page and codebehind) and so on… Unfortunately to use this feature yourself, you had to start editing the .csproj files yourself. Not the best way to start using a feature!

Thanks to Mads Kristensen File Nesting plugin this is no longer necessary and you can easily nest any file under another file in Solution Explorer.

What makes it even nicer, is that File Nesting also gives you the option to automatically nest based on file naming rules. You can then apply those rules to any files, folders or entire projects.

Install the plugin through the Visual Studio Extensions or download it here: http://visualstudiogallery.msdn.microsoft.com/3ebde8fb-26d8-4374-a0eb-1e4e2665070c.

Thanks Mads!

Tuesday, April 8, 2014

Free e-book: Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications

When you move your applications to the cloud, there are lot’s of new things you need to learn. But the cloud doesn’t only bring new challenges but also some great new opportunities.

To help you get the most of each cloud platform, Microsoft released a free e-book, Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications, that introduces some Cloud Specific Design Patterns. It contains twenty-four design patterns and ten related guidance topics that articulate the benefits of applying patterns by showing how each piece can fit into the big picture of cloud application architectures. It includes code samples and general advice on using each pattern.

image

Friday, April 4, 2014

TypeScript: using dynamic properties

Although I really like static typing and the other great features that TypeScript brings to JavaScript, sometimes I just want to profit from the dynamic nature of JavaScript.

I had a JavaScript/TypeScript object where I wanted to set a property value:

In TypeScript, this generates an error:

The property 'prop' does not exist on value of type '{}'

image

To fix it, I had to add a type annotation:

Thursday, April 3, 2014

Certificates snap-in: Where is the manage private keys option?

To setup a 2 way trust between my WCF service and (web) client I’m using SSL and X509 certificates. The problem was that I got the following exception on the client:

CryptographicException 'Keyset does not exist'.

I had this error before so I knew I had to give my application pool user access to the private key of the client certificate. So I opened MMC, loaded the Certificates snap in, right clicked on the certificate and saw… no ‘Manage Private Keys’ option Bedroefde emoticon.

It took me some time to figure out that I had to add the Certificates snap-in using the "Computer account" option instead of the default "My user account" optionVerwarde emoticon.

image

After doing that, the “Manage Private Keys” option was available:

image

Wednesday, April 2, 2014

F# series

Looking for a good introduction to F#?

Have a look at the F# series by Sacha Barber, a great set of blog posts where he covers almost all aspects of what F# has to offer…

Tuesday, April 1, 2014

OData: create a query using AddQueryOption

I got a question from a customer who wanted to create an ‘'IN” query(something like SELECT * FROM Address WHERE Postcode IN (2000, 1100, 1940, 1745)).

This is something you cannot do out-of-the-box using OData(not that I’m aware of). A possible alternative is using the AddQueryOption and build the filter condition yourself:

Remark: This only works if the list of elements is rather small.