Is this the correct usage of ConcurrentDictionary?
There isn't a lot of point of checking ContainsKey.  A thread could sneak in between the ContainsKey and Try* methods you are calling.  The TryGetValue out parameter will be initialized to the default value if it can't find the key.

The GetActiveClientCountFor could become this.

public static int GetActiveClientCountFor(string buildingName)
{
    int clientCount;
    _buildingsSubscribedTo.TryGetValue(buildingName, out clientCount);
    return clientCount;
}


In the IncrementClientCountFor code the value is retrieved and then added to.  If someone came in and updated the value the TryUpdate would fail as the count changed.  

What should be used is the AddOrUpdate method.  If the key doesn't exist it will be created and set to one.  If it does exist it will call the update method.  The update method could be called multiple times if the value changed before it could be set and will be set to the last good value. 

public static void IncrementClientCountFor(string buildingName)
{
    _buildingsSubscribedTo.AddOrUpdate(buildingName, 1, (s, i) =&gt; i++);
}


Same problem with DecrementClientCountFo.  The value is retrieved and checked if less than one.  But again a thread could add to dictionary and the code would remove it from the dictionary with a positive count.  To get an Atomic TryRemove I would create an extension method called TryRemove taken from http://blogs.msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx

public static class ConcurrentDictionaryExtensions
{
    //http://blogs.msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx
    public static bool TryRemove&lt;TKey, TValue&gt;(
        this ConcurrentDictionary&lt;TKey, TValue&gt; dictionary, TKey key, TValue value)
    {
        if (dictionary == null) throw new ArgumentNullException("dictionary");
        return ((ICollection&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;) dictionary).Remove(
            new KeyValuePair&lt;TKey, TValue&gt;(key, value));
    }
}


Now change DecrementClientCountFor to use AddOrUpdate then the Atomic TryRemove

public static void DecrementClientCountFor(string buildingName)
{
    var buildings = _buildingsSubscribedTo.AddOrUpdate(buildingName, s =&gt; 0, (s, i) =&gt; i--);
    if (buildings &lt; 1)
    {
        _buildingsSubscribedTo.TryRemove(buildingName, buildings);
    }
}


If the value was changed from underneath us after getting the value the TryRemove will fail.  Which is ok since it could be positive or another thread could have removed the key already.