Friday, May 19, 2017

VS Code–Angular Language Service

Yesterday while listening to the Adventures in Angular Podcast, I heard someone mention the Angular Language Service extension for VS Code.

From the documentation:

This extension provides a rich editing experience for Angular templates, both inline
and external templates including:

  • Completions lists
  • AOT Diagnostic messages
  • Quick info
  • Go to definition


Thursday, May 18, 2017

Improve performance of your ASP.NET Core application

ASP.NET Core is running on Kestrel, ASP.NET Core’s internal web server. Although really fast Kestrel is not a full blown web server. The idea is that you put another web server(on Windows typically IIS) in front of it that acts as a proxy and forwards the requests to Kestrel.

To get this working in IIS, an AspNetCoreModule exists that achieves this goal. Here is the web.config that configures all of this:

If you look at the configuration, you see that by default all request(path="*" verb="*") are forwarded to Kestrel. This isn't ideal because Kestrel is a lot slower in handling static files than IIS.

A better solution is to only forward the requests that should be handled by ASP.NET Core(by example; path="api/*" verb="*") and let other requests be served by IIS.

The magic trick is to use IIS URL Rewrite rules to forward requests to the wwwroot folder of your ASP.NET Core app:

UPDATE: Rick Strahl did a more complete blog post where he took this approach a few steps further:

Wednesday, May 17, 2017

Visual Studio Live! Videos

Over the years Visual Studio Live! delivered a lot of great content around the globe. On the Visual Studio Magazine blog, you find an overview of all keynotes. Certainly worth checking out…

One of my favorite sessions - Zero to DevOps with VSTS:

Tuesday, May 16, 2017

Visual Studio 2017–Convert to interpolated string refactoring

C# 6 introduces the concept of string interpolation allowing to use expressions inside your string literals providing a type safe alternative to string.format.

Last week I noticed a related refactoring option in VS 2017; when you have an existing string.format statement Visual Studio allows you to convert it to an interpolated string.



Monday, May 15, 2017

No assembly found containing an OwinStartupAttribute

After switching to Visual Studio 2017, one of the projects we were working on started to fail with the following error message:

The following errors occurred while attempting to load the app.

- No assembly found containing an OwinStartupAttribute.

- No assembly found containing a Startup or [AssemblyName].Startup class.

To disable OWIN startup discovery, add the appSetting owin:AutomaticAppStartup with a value of "false" in your web.config.

To specify the OWIN startup Assembly, Class, or Method, add the appSetting owin:AppStartup with the fully qualified startup class or configuration method name in your web.config.

In our case we don’t need the OWIN startup detection, so we followed the suggestion as mentioned in the error message and updated our config to:


       <add key="owin:AutomaticAppStartup" value="false" />


Strange that we didn’t had this problem before VS 2017…

More information:

Friday, May 12, 2017

Take a look into what’s coming next on Azure–The Azure Preview portal

After the “classic” Azure Portal and the “current” Azure Portal, it’s time to introduce a 3th portal, the PREVIEW portal. The Preview Portal allows you to access Azure Portal features before they are released to the main Azure Portal. This enables a sort of “Insider Preview” for just the Azure Portal.

You can access the Azure “Preview” Portal by visiting


Thursday, May 11, 2017

ASP.NET core–Log errors to disk

Quick tip if your ASP.NET core application is crashing and you cannot figure out why.

Inside the web.config of the IIS hosting process, change the configuration. Set the sdtoutLogEnabled property to true and specify a location where to output the logs using the stdoutLogFile property.

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>

Remark: I noticed that I had to create the logs folder first otherwise no files were written to this location…

Wednesday, May 10, 2017

Angular CLI–Documentation and Guidance

I’m a big fan of the Angular CLI, it made my life as an Angular developer a lot easier. It still has some rough edges but Angular was made to use with this kind of tooling.

One of the pieces that is still missing is good documentation. There is some guidance in the Angular documentation and some info on the GitHub website but I found the information to be incomplete(at the moment of writing) and had to fallback to StackOverflow for finding a lot of information.

Last week a colleague heard my complaints about the documentation and sent me a link to The Ultimate Angular CLI Reference Guide. Great tip!

Tuesday, May 9, 2017

.NET Application Architecture

If you want to get some insights on how to architect applications for the .NET stack , Microsoft created

Practical advice, best practices, and sample applications for using .NET with microservices, Docker containers, Kubernetes, Xamarin, ASP.NET, Azure, Service Fabric, and more.


Monday, May 8, 2017

TFS 2017–How to unconfigure an existing build agent

I couldn’t find good documentation, so here are the steps I used:

  • Browse to the folder where your agent is installed


  • Execute the /unconfigure command:

D:\Builds\Agents\Main1>agent\vsoagent /unconfigure

Removing EventLog source vsoagent.tfs.Agent-TMD4.

Service vsoagent.tfs.Agent-TMD4 is being removed from the system...

Service vsoagent.tfs.Agent-TMD4 was successfully removed from the system.

Attempt to stop service vsoagent.tfs.Agent-TMD4.


First time I tried this, I invoked the command directly from the agent subfolder:

D:\Builds\Agents\Main1\agent>vsoagent /unconfigure

However this failed with the following error message:

You cannot run the vsoAgent.exe interactively from within the Agent folder.

Friday, May 5, 2017

How can I view the used SSL certificate in Chrome?

As of Chrome 56, I noticed that it became a lot harder to inspect the SSL certificate used by a site. You can still access the SSL certificate settings in Windows by opening the Developer Tools (CTRL+SHIFT+i), go to "Security" tab and click the "View Certificate" button.


Thursday, May 4, 2017

TFS Build Agent doesn’t pick up all capabilities

Once a TFS build agent is configured on a build server it should scan the server for all capabilities and add them to a list. These capabilities can then be linked to demands to select an appropriate agent for your specific build script.


However at one client we noticed that the list of capabilities for all agents turned out rather empty whereas a lot of components were in fact installed on the server.

Inside the agent logs we found the following error message:

[2017-05-03 09:06:01Z INFO ProcessInvoker] Process started with process id 2828, waiting for process exit.

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: . : File D:\Builds\dev-agent-3\bin\powershell\Add-Capabilities.ps1 cannot be loaded. The file D:\Builds\dev-agent-3\bin

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: \powershell\Add-Capabilities.ps1 is not digitally signed. You cannot run this script on the current system. For more in

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: formation about running scripts and setting execution policy, see about_Execution_Policies at

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: wlink/?LinkID=135170.

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: At line:1 char:3

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: + . 'D:\Builds\dev-agent-3\bin\powershell\Add-Capabilities.ps1'

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR: +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR:     + CategoryInfo          : SecurityError: (:) [], PSSecurityException

[2017-05-03 09:06:03Z INFO PowerShellCapabilitiesProvider] STDERR:     + FullyQualifiedErrorId : UnauthorizedAccess

[2017-05-03 09:06:03Z INFO ProcessInvoker] Finished process with exit code 1, and elapsed time 00:00:01.2248303.

On this server a group policy is applied that prevents the execution of unsiged Powershell scripts. As the agent is using Powershell to scan a system for capabilities it failed silenty behind the scenes.

The solution was to ask the server team to sign all scripts for us.

Wednesday, May 3, 2017

Explaining LINQ visually

If you are not convinced in using LINQ yet, go have a look at Michael Sorens blog post. He nicely visualize the behavior of (almost) every LINQ operator and provides a set of characteristics of each LINQ operator explaining position, syntax,execution, laziness, complexity and any optional features.

A must read for every .NET developer!



Tuesday, May 2, 2017

MSTest–Setting the Culture of your tests

Last week after introducing localization into our application our builds started to fail. Inside the build log we saw that only tests related to localization were failing.

What happened? The problem was that the tests where expecting a specific culture to be set which was different on our local machines compared to the build server. So we needed a way to set the (UI)culture for our tests.

A solution that worked for us was to set the CultureInfo.DefaultThreadCurrentCulture and CultureInfo.DefaultThreadCurrentUICulture in the Assembly initializer of our tests:


Remark: Don’t forget to add the [TestClass] attribute on top of your class otherwise MSTest will not invoke the AssemblyInitialize method.

Monday, May 1, 2017

TFS 2017–How to uninstall the ElasticSearch service?

One of the new features of TFS 2017 is the introduction of a code search service. This service is built on top of a customized version of ElasticSearch and can be installed together with the rest of the product.

However the experience is still somewhat rough around the edges.

For example deleting the ElasticSearch service can’t be done through Add/Remove Programs or through an UI but you have to fallback to Powershell instead:

  • Open Powershell as an administrator
  • Go to the folder where ConfigureTFSSearch.ps1 is installed.
  • Run the script again with the remove option: "ConfigureTFSSearch.ps1 -RemoveTFSSearch"

In case you cannot find this Powershell commandlet an alternative option is to browse to the ElasticSearch bin directory and execute the following command:

  • service.bat remove