Friday, November 17, 2017

ADFS–Where to find issuer thumbprint for WIF(Windows Identity Foundation)?

To validate a new installation of ADFS, we created a small sample app that used Windows Identity Foundation to authenticate to the ADFS server.

We got most information from our system administrator, but it turned out that the Issuer Thumbprint was missing.

As the system administrator wasn’t in the office, we had to find a different solution to get the thumbprint.

Here is what we did:


  • To read out the certificate information(and the thumbprint) you have to
    • Create a new text file
    • Copy the certificate value into the file
    • Save the file with a .cer extension
  • Now you can open the file, and read out the thumbprint value:
    • Double click on the file
    • Go to the Details tab
    • Scroll to the thumbprint property


    Thursday, November 16, 2017

    TFS 2018– Remove ElasticSearch

    Here is an update regarding my post

    In TFS 2018, the command to remove your ElasticSearch instance changed a little and the steps became:

    • Open Powershell as an administrator
    • Go to the folder where ConfigureTFSSearch.ps1 is installed. In TFS 2018, this is typically C:\Program Files\Microsoft Team Foundation Server 2018\Search\zip
    • Run the ConfigureTFSSearch script with the remove option: ".\Configure-TFSSearch.ps1 -Operation remove"

    Wednesday, November 15, 2017

    ElasticSearch–Understand the query magic using ‘explain’

    Sometimes an ElasticSearch query is invalid or doesn’t return the results you expect. To find out what is going on, you can add the explain parameter to the query string:


    In your results you get an extra explanation section


    More information:

    Tuesday, November 14, 2017

    Using GuidCOMB in SQL Server and PostgreSQL

    On a project I’m working on, we expect to have a really large amount of data. Therefore we decided to switch our ID strategy from Integers to GUIDs. Problem is that when you start using GUIDs as part of your database index, they become really fragmented resulting in longer write times.

    To solve this, you can use the GuidCOMB technique where a part of the GUID is replaced by a sorted date/time value. This guarantees that values will be sequential and avoids index page splits.

    NHibernate and Marten supports the GuidCOMB technique out-of-the-box but if you want to use it with other tools you can try RT.Comb,  a small .NET Core library that generated “COMB” GUID values in C#.

    Here is a sample how to use it in combination with Entity Framework:

    • Let’s first create an Entity Framework Value Generator that uses the RT.Comb library:
    • To apply this generator when an object is added to a DbContext, you can specify it in the Fluent mapping configuration:

    Friday, November 10, 2017

    Kestrel error: The connection was closed because the response was not read by the client at the specified minimum data rate.

    While running some performance tests on our ASP.NET Core application, after increasing the load to a certain level, we saw the following error messages appear on the server:

    The connection was closed because the response was not read by the client at the specified minimum data rate.

    This error is related to the Minimum request body data rate specified by Kestrel.

    From the documentation:

    Kestrel checks every second if data is coming in at the specified rate in bytes/second. If the rate drops below the minimum, the connection is timed out. The grace period is the amount of time that Kestrel gives the client to increase its send rate up to the minimum; the rate is not checked during that time. The grace period helps avoid dropping connections that are initially sending data at a slow rate due to TCP slow-start.

    The default minimum rate is 240 bytes/second, with a 5 second grace period.

    A minimum rate also applies to the response. The code to set the request limit and the response limit is the same except for having RequestBody or Response in the property and interface names.

    The problem was that we were simulating our load from one machine which was not capable of sending enough data at the expected request rate. After scaling out our load tests to multiple test agents on different machines, the problem disappeared…

    Thursday, November 9, 2017

    Azure Storage Explorer–Support for Cosmos DB

    Great news! From now on the Azure Storage Explorer can be used to manage your Cosmos DB databases.

    Key features

    • Open Cosmos DB account in the Azure portal
    • Add resources to the Quick Access list
    • Search and refresh Cosmos DB resources
    • Connect directly to Cosmos DB through a connection string
    • Create and delete Databases
    • Create and delete Collections
    • Create, edit, delete, and filter Documents
    • Create, edit, and delete Stored Procedures, Triggers, and User-Defined Functions


    Install Azure Storage Explorer: [Windows], [Mac], [Linux]

    Wednesday, November 8, 2017

    .NET Core Unit Tests–Enable logging

    I noticed that .NET Core Unit Tests capture the output send through tracing (via Trace.Write()) and through the console (via Console.Write()).

    It took me some time before I had the correct code to get the Microsoft.Extensions.Logging data written to my test logs.

    So here is a small code snippet in case you don’t want to search for it yourself:

    Remark: Don’t forget to include the Microsoft.Extensions.Logging.Console nuget package.

    Tuesday, November 7, 2017

    .NET Core Unit Tests–Using configuration files

    Here are the steps to use Microsoft.Extensions.Configuration in your .NET Core unit tests:

    Monday, November 6, 2017

    Git–Commit changes to a new branch

    Did it ever happend to you that you were changing some code in one branch until you realized that you actually wanted to commit on another (new) branch?

    I was expecting that this was not easy to do, but in fact it’s rather easy.

    Don’t stage your changes, instead just create a new branch using

    git checkout -b another-branch

    This will create and checkout “another-branch”.

    Now you can stage your files using

    git add .

    and commit them using

    git commit -m <message>

    Remark: This works in Visual Studio as well

    Friday, November 3, 2017

    TypeScript Index Signatures

    I love TypeScript and how it helps me writing better JavaScript applications. However sometimes I struggle with the dynamic world that JavaScript has to offer and the fight for type safety that TypeScript adds to the mix.

    A situation I had was where I had some objects each sharing the same set of properties. However in some situations extra metadata was added depending on the customer(it’s a multitenant solution). So I created an interface for all the shared properties, but what should I do with the (possible) extra metadata? Adding so many different extra properties on the interface and making them optional sounded not ideal?

    TypeScript allows you to add extra properties to specific objects with the help of index signatures. Adding an index signature to the interface declaration allows you to specify any number of properties for different objects that you are creating.

    An example:

    Thursday, November 2, 2017

    .NET Core SignalR Client error: System.IO.FileLoadException: Could not load file or assembly 'System.Runtime.InteropServices.RuntimeInformation

    To test a .NET Core SignalR application, I created a sample application(using the full .NET framework) where I included the Microsoft.AspNetCore.SignalR.Client NuGet package and added the following code:

    However when I tried running this application, it failed with the following error message:

    System.IO.FileLoadException: Could not load file or assembly 'System.Runtime.InteropServices.RuntimeInformation, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

    I checked all my assembly references but they all seemed OK.

    As a workaround, I was able to avoid the issue by removing the .WithConsoleLogger() line. Anyone who has an idea what can be wrong?

    Remark: I think it has to do something with the SignalR client which targets .NET Standard 2.0 and my sample application wich targets .NET Framework 4.7. But no clue what exactly is causing it…

    Wednesday, November 1, 2017

    Web.config transformations in .NET Core

    In a previous post I mentioned that we started to put environment variables inside our web.config files to change the ASPNETCORE_ENVIRONMENT setting inside our ASP.NET Core apps. As we were already using Web Deploy to deploy our ASP.NET Core applications, we decided to use the web.config transformations functionality to set the environment variable in our web.config to a correct value before deploying:

    • We created extra web.{environment}.config files


    • And added the Xdt transformation configuration:

    However when we tried to deploy, we noticed that the transformation was not executed and that the original web.config file was used.

    What did we do wrong?

    The answer turned out to be “Nothing”. Unfortunately ASP.NET Core projects don’t support the transformation functionality. Luckily, a colleague(thanks Sami!) brought  the following library under my attention:

    dotnet-transform-xdt is a dotnet CLI tool for applying XML Document Transformation (typically, to ASP.NET configuration files at publish time, but not limited to this scenario).

    That’s exactly what we need!

    How to use dotnet-transform-xdt?

    • Right click on your ASP.NET Core project and choose Edit csproj
    • Add the following line to the list of Package references:

    <DotNetCliToolReference Include="Microsoft.DotNet.Xdt.Tools" Version="2.0.0" />

    • Add the following target before the closing </project>:

    <Target Name="ApplyXdtConfigTransform" BeforeTargets="_TransformWebConfig">
       < Exec Command="dotnet transform-xdt --xml &quot;$(_SourceWebConfig)&quot; --transform &quot;$(_XdtTransform)&quot; --output &quot;$(_TargetWebConfig)&quot;" Condition="Exists('$(_XdtTransform)')" />
    < /Target>

    • If you now run dotnet publish  and examine the Web.config in the publish output folder, a transformed web.config should be there…

    Tuesday, October 31, 2017

    Visual Studio 2017 (Enterprise) - Where are the Web performance and load testing tools?

    Yesterday I wanted to do some performance testing before we put a new application into production. However when I opened Visual Studio (2017) I couldn’t find the Web performance and load testing tools.

    Are there no longer available in VS 2017? Luckily, they still are. But they are not installed out-of-the-box.

    Let’s open the Visual Studio installer and fix this:

    • Search for Visual Studio Installer and execute it


    • Click on More –> Modify


    • Go to the Individual components tab, scroll to the Debugging and testing section and select Web performance and load testing tools.


    • Click Modify to start the installation

    Monday, October 30, 2017

    C# 7: Lambdas vs Local functions

    C# 7 introduces the concept of local functions. Local functions can be nested in other functions similar to anonymous delegates or lambda expressions. Doesn’t this make local functions redundant? Not at all, anonymous functions and lambda expressions have certain restrictions that local functions have not.

    Here is a list of things a local function can do that lambda’s can’t:

    • Local functions can be called without converting them to a delegate

    • Local functions can be recursive

    • Local functions can be iterators

    • Local functions can be generic

    • Local functions have strictly more precise definite assignment rules

    • In certain cases, local functions do not need to allocate memory on the heap

    More information can be found at:

    Friday, October 27, 2017

    Angular: Cancel a pending HTTP request

    In case you are wondering how to cancel a pending HTTP request, here is the (simple) answer.  You can do this by calling unsubscribe on the Subscription object returned by the  subscribe method.

    An example:


    Thursday, October 26, 2017

    Angular aot build error–No template specified for component

    A colleague sent me the following screenshot with an error he got after switching to an AOT build in Angular:


    Here is the related TypeScript file for this component:

    The problem was caused by the “template: require('./perceel-list.component.html')” statement in the component file. The aot build doesn’t like it when you try to resolve html templates dynamically.

    Removing the require and just using the templateUrl instead solved the problem:

    Wednesday, October 25, 2017

    Angular CLI– ng build --prod

    Did you know that you can pass a “--prod” parameter when executing compiling your Angular code using “ng build”?

    The "--prod” option also has a development counterpart “--dev”. They will set the following list of parameters:

    Flag --dev --prod
    --aot false true
    --environment dev prod
    --output-hashing media all
    --sourcemaps true false
    --extract-css false true
    --named-chunks true false

    More information:

    Tuesday, October 24, 2017

    Swagger–Expose enums as strings in your Web API

    By default Swagger exposes enums in your API definitions as numbers which makes it not easy to understand what a specific parameter value means.


    You can configure Swagger to expose enums using string names instead. Therefore add the following line to your Swagger configuration:



    Monday, October 23, 2017

    Send extra arguments to npm script in package.json

    In our package.json we defined some script commands to automate certain actions.

    However sometimes we want to add extra parameters to the script when executing it. This is possible by adding an extra pair of dashes  and the extra parameter when executing the command:

    ngbuild -- --environment=local

    Friday, October 20, 2017

    .NET Conf 2017

    In case you missed .NET Conf 2017, all the videos are available online on Channel 9.


    Thursday, October 19, 2017

    SQL Server Full Text Search–Wildcards

    The SQL Server Full Text Search option is really powerful. However you need to be aware that by default a search is always done on a full word. For example if you had indexed ‘the quick brown fox jumps over the lazy dog’ and you search for ‘brow’ you don’t get a result back.

    To solve this you can use wildcards, but you have to be aware that you put the full search term between quotes.

    This query will not work:

    SELECT BookID,BookTitle

    FROM Books

    WHERE CONTAINS(BookTitle,'brow*')

    But this query will:

    SELECT BookID,BookTitle

    FROM Books

    WHERE CONTAINS(BookTitle,'"brow*"')

    Wednesday, October 18, 2017

    Angular i18n issue - Cannot read property 'toLowerCase' of null

    After following the steps in the Angular documentation to setup internationalization(i18n) support, I tried to execute my brand new i18n npm command:

    PS C:\Projects\test\AngularLocalization\angularlocal> npm run i18n

    > angularlocal@0.0.0 i18n C:\Projects\test\AngularLocalization\angularlocal

    > ng-xi18n

    TypeError: Cannot read property 'toLowerCase' of null

        at Extractor.serialize (C:\Projects\test\AngularLocalization\angularlocal\node_modules\@an


        at C:\Projects\test\AngularLocalization\angularlocal\node_modules\@angular\compiler-cli\sr


        at process._tickCallback (internal/process/next_tick.js:109:7)

        at Module.runMain (module.js:606:11)

    at run (bootstrap_node.js:389:7)

        at startup (bootstrap_node.js:149:9)

        at bootstrap_node.js:502:3

    Extraction failed

    npm ERR! Windows_NT 10.0.15063

    npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\

    npm\\bin\\npm-cli.js" "run" "i18n"

    npm ERR! node v6.11.3

    npm ERR! npm  v3.10.10

    npm ERR! code ELIFECYCLE

    npm ERR! angularlocal@0.0.0 i18n: `ng-xi18n`

    npm ERR! Exit status 1

    npm ERR!

    npm ERR! Failed at the angularlocal@0.0.0 i18n script 'ng-xi18n'.

    npm ERR! Make sure you have the latest version of node.js and npm installed.

    npm ERR! If you do, this is most likely a problem with the angularlocal package,

    npm ERR! not with npm itself.

    npm ERR! Tell the author that this fails on your system:

    npm ERR!     ng-xi18n

    npm ERR! You can get information on how to open an issue for this project with:

    npm ERR!     npm bugs angularlocal

    npm ERR! Or if that isn't available, you can get their info via:

    npm ERR!     npm owner ls angularlocal

    npm ERR! There is likely additional logging output above.

    npm ERR! Please include the following file with any support request:

    npm ERR!     C:\Projects\test\AngularLocalization\angularlocal\npm-debug.log

    Whoops! This was not the output I was hoping for…

    Strange! Because it worked perfectly before Confused smile. A search through the issues on GitHub brought me to the following issue:

    The issue seems to have appeared in Angular 4.0.3. Luckily a workaround exists, I altered the commando in my package.json to include the prefered format:


    When I invoked the i18n command again, this time it worked without a problem.

    Tuesday, October 17, 2017

    Impress your colleagues with your knowledge about…Expression Evaluator Format Specifiers

    Sometimes when working with C# 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 are Expression Evaluator Format Specifiers.

    What is it?

    Expression Evaluator Format Specifies come into the picture when you are debugging in Visual Studio. The part of the debugger that processes the language being debugged is known as the expression evaluator (EE). A different expression evaluator is used for each language, though a default is selected if the language cannot be determined.

    A format specifier, in the debugger, is a special syntax to tell the EE how to interpret the expression being examined. You can read about all of the format specifiers in the documentation.

    One of really useful format specifiers is the ‘ac’ (always calculate) format specifier. This format specifier will force evaluation of the expression on every step. This is useful during debugging when you want to track a specific value.

    How to use it?

    • Start a debugging session in your application.


    • Go to the Watch window(Debug –> Windows –> Watch –> Watch 1)


    • Write the expression that you want to check, a comma and the format specifier; {expression},{format specifier}


    • If you use the ac format specifier you don’t have to refresh your expression but will it be evaluated on every step:



    Monday, October 16, 2017

    Seeing the power of types

    Most applications I’ve seen don’t take advantage of the power of the type system and fall back to primitive types like string, int, … .

    But what if you start using the type system to design a more understandable and less buggy application?

    You don’t believe it is possible? Have a look at the Designing with Types blog series, it will change the way you write your code forever…

    The complete list of posts:

    1. Designing with types: Introduction

    Making design more transparent and improving correctness

    2. Designing with types: Single case union types

    Adding meaning to primitive types

    3. Designing with types: Making illegal states unrepresentable

    Encoding business logic in types

    4. Designing with types: Discovering new concepts

    Gaining deeper insight into the domain

    5. Designing with types: Making state explicit

    Using state machines to ensure correctness

    6. Designing with types: Constrained strings

    Adding more semantic information to a primitive type

    7. Designing with types: Non-string types

    Working with integers and dates safely

    8. Designing with types: Conclusion

    A before and after comparison

    Friday, October 13, 2017

    Angular: Analyze your webpack bundles

    To optimize your application it can be useful to investigate all the things that are loaded and used inside your webpack bundles. A great tool to visualize this information is the webpack dependency analyzer:

    From the documentation:

    The Webpack dependency analyzer is a Webpack plugin and CLI utility that represents bundle content as convenient interactive zoomable treemap

    webpack bundle analyzer zoomable treemap

    This module will help you:

    1. Realize what's really inside your bundle
    2. Find out what modules make up the most of it's size
    3. Find modules that got there by mistake
    4. Optimize it!

    How to use it inside your Angular app?

    • Install the bundle through npm:
      • npm install webpack-bundle-analyzer
    • Update your package.json with an extra command:
      • "analyze": "ng build --prod --stats-json && webpack-bundle-analyzer dist/stats.json"
    • Invoke the command through npm
      • npm run analyze
    • A browser window is loaded at

    Thursday, October 12, 2017

    IIS Server configs

    If you are hosting your ASP.NET applications inside IIS I have a great tip for you:

    This GitHub project contains a list of boilerplate web.config files applying some best practices(like security hardening) and taking maximal advantage of the powerfull functionality that IIS has to offer.

    It shows and explains how to:

    • Apply security through obscurity by not exposing specific information through the headers
    • Apply GZIP compression on static content
    • Disable tracing
    • Secure your cookies
    • Cache static content
    • Support cache busting

    Wednesday, October 11, 2017

    ASP.NET Core–Environment variables

    ASP.NET Core references a particular environment variable, ASPNETCORE_ENVIRONMENT to describe the environment the application is currently running in. This variable can be set to any value you like, but 3 values are used by convention: Development, Staging, and Production.

    Based on this information the ASP.NET Core configuration system can load specific configuration settings (through .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) )
    or execute a specific Startup class or Startup method through the Startup conventions(e.g. a Startup{EnvironmentName} class or a Configure{EnvironmentName}() method inside the Startup class).

    At one customer we are hosting our ASP.NET Core applications inside IIS. The IIS environment is used both for development and testing. So we want to host the same application twice with a different environment setting. By default the environment setting is loaded from a system level environment variable which of course can be set to only one value.

    How can we solve this?

    To support this scenario the ASP.NET Core Module inside your web.config allows you specify environment variables for the process specified in the processPath attribute by specifying them in one or more environmentVariable child elements of an environmentVariables collection element under the aspNetCore element. Environment variables set in this section take precedence over system environment variables for the process.

    An example:

    Tuesday, October 10, 2017

    ASP.NET Core 2.0–Authentication Middleware changes

    ASP.NET Core 2.0 introduces a new model for authentication which requires some changes when upgrading your existing ASP.NET Core 1.x applications to 2.0.

    In ASP.NET Core 1.x, every auth scheme had its own middleware, and startup looked something like this:

    In ASP.NET Core 2.0, there is now only a single Authentication middleware, and each authentication scheme is registered during ConfigureServices() instead of during Configure():

    More information:

    Monday, October 9, 2017

    Angular 4.3: HTTP Interceptors are back

    With the introduction of a new HttpClient in Angular 4.3, an old feature of Angular.js was re-introduced; HttpInterceptors. Interceptors are sitting between the application and the backend and allow you to transform a request coming from the application before it is actually submitted to the backend. And of course you when a response arrivers from the backend an interceptor can transform it before delivering it to your application logic.

    This allows us to simplify the interaction with the backend in our Angular app and hide most of the shared logic inside an interceptor.

    Let’s create a simple example that injects an OAuth token in our requests:

    To be able to use the interceptor, you’ll have to register it:

    Friday, September 29, 2017

    Enabling Application Insights on an existing project

    Yesterday I lost some time searching how to Enable Application Insights on an existing project in Visual Studio.

    I thought it was available on the context menu when you right click on your Visual Studio project, but no option found there:


    Turns out you need to go one level deeper Confused smile;

    • Right click on your project
    • Click on Add and select Application Insights Telemetry…


    Now you can go through the configuration wizard by clicking on Start Free:


    Thursday, September 28, 2017

    Visual Studio 2017 Offline install - “Unable to download installation files”

    After creating an offline installer for Visual Studio 2017 using vs_enterprise.exe --layout c:\vs2017offline we were ready to install Visual Studio on our build servers(which don’t have Internet access).

    However when we tried to run the installer, it failed after running for a few minutes with the following error message:

    Unable to download installation files

    Unable to download install files

    This error message was not that useful as we found out that the problem was not related to missing installation files but due to the fact that we forgot to install the required certificates first.

    To install the certificates first, you have to

    1. Browse to the "certificates" folder inside the layout folder you created(e.g. c:\vs2017offline\certificates)

    2. Right-click each one and choose Install PFX.

    3. Specify Local machine as target certificate store
    4. Leave the password field empty

    More information:

    Wednesday, September 27, 2017

    Team Foundation Server–Upgrade your build agents

    If you upgrade your TFS installation to a newer version, a new version of the build agent is available as well.

    To upgrade your agents, you have 2 options:

    • If a new major version of the agent is released, you’ll have to manually delete the old agent and install a new agent.
    • If a new minor version of the agent is released, the existing agent is upgraded automatically when it runs a task that requires a newer version of the agent.
      • If you want to trigger the update manually, you can go to the Agent Pool hub, right click on a Queue and click on Update All Agents.


    More information at

    Tuesday, September 26, 2017

    NPGSQL–Relation does not exist

    PostgreSQL has great .NET support thanks to the open source NPGSQL library.

    From the home page:

    Npgsql is an open source ADO.NET Data Provider for PostgreSQL, it allows programs written in C#, Visual Basic, F# to access the PostgreSQL database server. It is implemented in 100% C# code, is free and is open source.

    In addition, providers have been written for Entity Framework Core and for Entity Framework 6.x.

    However I immediately had some problems the moment I tried to execute a query. Strange thing was that my code almost the same as what could be found on the Getting Started page;

    The error I got was the following:

    Query failed: ERROR: relation "Northwind.Products" does not exist

    I tried to execute the same query directly in the PGAdmin tool and indeed I got the same error.

    What am I doing wrong? The problem is that PostgreSQL by default implicitly converts unquoted identifiers in my query to lowercase.

    So the following query;

    SELECT Id, ProductName FROM Northwind.Products

    was transformed to

    SELECT id, productname FROM northwind.products

    As object names are case sensitive in PostgreSQL(or so it seems), this resulted in the fact that my table was not found.

    There are 2 possible solutions:

    • Use quotes around your identifiers: SELECT “Id”, “ProductName” FROM “Northwind”.”Products”
    • Change the casing of your database objects(tables, columns, …) to lowercase

    I choose the last option, because I had to escape my query in string in my C# code otherwise.

    Monday, September 25, 2017

    TypeScript error–Property ‘assign’ does not exists on type ‘ObjectConstructor’

    A colleague asked me for help when he got into trouble with his TypeScript code. Here is a simplified version:

    Although this looks like valid code, the TypeScript compiler complained:


    After some headscratching, we discovered that there was a “rogue” tsconfig.json at a higher level that set “ES5” as the target. Object.Assign was added as part of “ES6” explaining why TypeScript complained.


    After changing the target to “es6”, the error disappeared.

    Friday, September 22, 2017

    VSWhere.exe–The Visual Studio Locator

    As someone who has built a lot if CI and CD pipelines, one of the struggles I always got when new Visual Studio versions were released was how to make my build server use the correct version of MSBuild when multiple Visual Studio versions were installed.

    It got a lot better over the years, but even recently I was sitting together with a customer to investigate how we could make the build server understand that the Visual Studio 2017 Build tools should be used.

    One of the (badly documented) tricks you could use was scanning the registry for specific registry keys. Luckily Microsoft released recently a new tool that makes finding your Visual Studio instances a lot easier: vswhere.exe

    From the documentation:

    vswhere is designed to be a redistributable, single-file executable that can be used in build or deployment scripts to find where Visual Studio - or other products in the Visual Studio family - is located. For example, if you know the relative path to MSBuild, you can find the root of the Visual Studio install and combine the paths to find what you need.

    You can emit different formats for information based on what your scripts can consume, including plain text, JSON, and XML. Pull requests may be accepted for other common formats as well.

    vswhere is included with the installer as of Visual Studio 2017 version 15.2 and later, and can be found at the following location: %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe. The binary may be copied from that location as needed, installed using Chocolatey, or the latest version may be downloaded from the releases page. More information about how to get vswhere is on the wiki.

    This tool is also used internally in the VSBuild build task in TFS to discover recent Visual Studio versions(2017 and newer).

    A quick sample:

    • Open a command prompt
    • Browse to %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\ or the location where you downloaded vswhere.exe.
    • Let’s try vswhere –latest


    Thursday, September 21, 2017

    .NET Standard: Using the InternalsVisibleToAttribute

    In .NET Standard projects, there is an AssemblyInfo class built-in, so you no longer need a separate AssemblyInfo.cs file in your project Properties.

    But what if you want to use the InternalsVisibleToAttribute? This was one of the attributes I used a lot to expose the internals of my Assembly to my test projects.

    Turns out that it doesn’t matter really where you put this attribute. It is applied at the assembly level, so you can include in any source code file you like. Using the AssemblyInfo file was just a convenience.

    So what I did, was creating an empty .cs file and add the following code:

    Wednesday, September 20, 2017

    .NET Standard: Duplicate 'System.Reflection.AssemblyCompanyAttribute' attribute

    In a ‘classic’ .NET project, you have an AssemblyInfo.cs file.


    This file contains all kind of information about your assembly

    After upgrading a classic .NET project to .NET Standard, I started to get errors about some of the properties inside the AssemblyInfo.cs file:


    A .NET Standard project already has the AssemblyInfo information built-in. So after upgrading you end up with 2 AssemblyInfo specifications, leading to the errors above.

    The solution is to remove the original AssemblyInfo.cs file in the Properties folder.

    Remark: If you want to change the assembly information, you now have to use the Package tab inside your Project Properties.


    Tuesday, September 19, 2017

    RabbitMQ–Configure access to Management portal

    As mentioned in a previous post, it is probably a good idea to enable the RabbitMQ Management plugin to help you track what’s going inside your service broker.

    Now if you try to access the Management plugin using the default guest account(which you should probably remove), outside the server itself, you get a ‘Login failed’ error.


    Let’s fix this:

    • Logon to the server
    • Browse to the management portal using the localhost address: http://localhost:15762
    • Logon using the guest account


    • Click on the Admin tab and scroll to the Add a user section
      • Enter a Username and Password
      • Specify one or more Tags as a comma separated list. If you want to give full access, enter ‘administrator’.
      • Click on the Add user button


    • Now click on the newly created user in the user list


    • The set permission section is shown


    • Leave the default settings and click Set permission.
    • That’s it!

    Remark: You can do the same steps using the command line tooling. For example, if you want to set the user tags, you can use

    $ rabbitmqctl set_user_tags yourName administrator

    Monday, September 18, 2017

    RabbitMQ–Enable Management plugin

    To simplify management and monitoring of your RabbitMQ Service Broker it is a good idea to install the management plugin(don’t expect anything fancy).

    • To install it, logon to the server where you installed RabbitMQ
    • Open a RabbitMQ command prompt


    • Enter the following command
      • rabbitmq-plugins enable rabbitmq_management
    • You’ll get the following log output

    D:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.12\sbin>rabbitmq-plugins en

    able rabbitmq_management

    The following plugins have been enabled:







    Applying plugin configuration to rabbit@SERVER01... started 6 plugins.


    • If you want to access the portal from outside the server, you have to configure a firewall rule that allows TCP traffic on port 15672.


    • Remark: Notice that when you try to access the management portal from outside the server using the default guest account, it will not work. This is a security feature that is enabled by default. To solve that, we’ll create another account, but that’s something we cover in another blog post.

    Friday, September 15, 2017

    ASP.NET Core–Configuring a WCF service

    In an ASP.NET Core application(using the full .NET framework) we had to consume a WCF service.

    Should be easy right? Unfortunately it turned out that be more work than I expected. In a first post I explained the steps how to generate a Client Proxy, this post is about  setting the configuration.

    WCF configuration can be a daunting beast with a lot of options and things that can go wrong. The code generated by the proxy hardcodes (some part) of the configuration in the WCF proxy and provides you a partial method to override it but that’s not the approach we want to take.

    I know we’ll host the WCF service in IIS, so adding a web.config and putting the configuration logic over there sounds nice…

    Let’s try that:

    • Open the generated proxy reference file  and remove the call to Service1Client.GetDefaultBinding() and Service1Client.GetDefaultEndpointAddress() in the constructor. (Note: this is only for testing purposes)


    • Right click on your ASP.NET Core project and add a web.config file.
    • Right click on the web.config and choose Edit WCF configuration.


    • Go to the Client section and choose Create a New Client…


    • Follow the steps through the Wizard. After completing it you should have something like this inside your web.config:
    • Let’s now try to create a client proxy instance and execute a call:
    • Unfortunately, this didn’t work and we end with an exception when we try to run our application:


    • If that doesn’t work, where should we put this configuration? (And yes, I know I can do everything through code but that is not what I want here).
      • An ASP.NET Core project is an executable behind the scenes. The only thing that IIS does is forward the request to Kestrel that invokes the DotNet process.
      • This executable has its own configuration file that is generated for you out of the box behind the scenes.


    • If you want to change this config, you have to add an app.config instead of a web.config to your project. Let’s just rename the file, rebuild our project and try again…


    • This time it works!


    Thursday, September 14, 2017

    ASP.NET Core–Connecting to a WCF service

    In an ASP.NET Core application(using the full .NET framework) we had to consume a WCF service.

    Should be easy right? Unfortunately it turned out that be more work than I expected.

    • I right clicked on my project and searched for an Add service reference… option. No luck, instead I saw a Connected Services section. Maybe that will do it?


    • I right clicked on the Connected Services section and choose Add Connected Service.


    • This opened up the Connected Services window but no option was available to connect to an existing WCF service Sad smile


    • Maybe the Find more services… link at the button will help me? This brought me to the Visual Studio Marketplace. And yes… a search for ‘WCF’ showed up a Visual Studio Connected Services plugin that allows to add a WCF Web service reference to .NET Core projects. Exactly what I needed.


    • I clicked on Download, closed Visual Studio after which the installer appeared and I could install the extension.
    • After the installation has completed, we can open up Visual Studio again, try Add Connected Services again. This time we see a 3th option appear:
      • Microsoft WCF Web Service Reference Provider – Preview


    • Click on it and you’ll get the same options you had before when using Add service reference…