If you are working or studying in NTU (Nanyang Technological University), you may want to connect to NTU’s VPN from home sometimes (for some remote desktop for example). I have tried to follow the instructions at http://www.ntu.edu.sg/cits/itnetworking/remoteaccess/Pages/quickstartguide.aspx. Those methods works great on Windows 7, Windows 8.0 and Windows 8.1 as well. However, I don’t really like to install Juniper or NTURAS VPN on my laptop, mainly because it is already very messy and I don’t want to make it any messier, so I tried to setup a VPN connection manually and now it becomes so convenient connect.
Month: October 2013
SignalR, camel case and a lost of connection problem
The Problem
Today I went into a problem trying to configure SignalR to automatically serialize my data contracts in camel cases. Having done that once for Web API, I knew that it can be done easily by changing the contract resolver of JSON.NET to CamelCasePropertyNamesContractResolver. So I went ahead and incorporate the new ContractResolver to SignalR:
1 2 3 |
var serializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var jsonNetSerializer = new JsonNetSerializer(serializerSettings); GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => jsonNetSerializer); |
It looks good and everything run without a warning or error except that SignalR is no longer be able to connect to the server. I confirmed this by putting a breakpoint inside this function.
1 2 3 |
$.connection.hub.start().done(function () { … }); |
At first I did not realize the culprit was the camel case, so I try to dig deeper under the hood. I used the new diagnostic tool of IE11 to see what’s going on and compared with a previous version to see what’s going on. I could clearly see that the new version lack the 2 calls: connect and send although the negotiate when through successfully with a 200 response. (The first image was the SignalR calls in the new version and the second image was the SignalR calls in the old version)
I decided to dig even deeper into the negotiate response, and I found the culprit. The property names here suppose to be proper case, not camel (so it should be Url instead of url). So probably SignalR cannot interpret the response!
The solution
This problem was actually solved properly by several people.
The basic idea was to change the contract resolver but limit the effect of camel case to only classes external to SignalR. I tried the solution in the first link and it worked like a charm! It’s great to learn that today!
Async void is not the only way to fire and forget
I have developed several apps for Windows 8 and Windows Phone 8, and I am always amazed my one new feature that was introduced to the C# compiler: async and await.
If you are not familiar with the new async feature of C#, you could try to search for “C# async programming” on the Internet or go to this page on MSDN to read the documentation:
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
If you have already used async/await for a while, you must be aware of the danger of async void (aka “fire-and-forget”), which could creates unobserved exception easily. In other words, you cannot simply use a try-catch block to catch the exception if you are awaiting an async void. There are already many blog posts and videos on this topic already, so I will not describe it again here. You can have a look at this video if you want to know more about the problem of async void: