Inheritance: System.Net.WebClient
        public void SubscribeToEvent(string subscribeUri)
        {
            var client = new ExtendedWebClient();
            //SUBSCRIBE /MediaServer/ContentDirectory/Event HTTP/1.1
            //HOST: 192.168.1.152:1400
            //USER-AGENT: Linux UPnP/1.0 Sonos/19.3-53220 (WDCR:Microsoft Windows NT 6.1.7601 Service Pack 1)
            //CALLBACK: <http://192.168.1.128:3400/notify>
            //NT: upnp:event
            //TIMEOUT: Second-3600
            // find local IP
            var uri = listener.Prefixes.FirstOrDefault();

            if (uri == null)
                return;

            var localUri = uri.Replace("*", LocalEndpoint.Address.ToString());

            //client.Headers.Add("USER-AGENT", "Linux UPnP/1.0 Sonos/19.3-53220 (Custom:Jishi.SonosUPnP)");
            if (subscriptions.ContainsKey(subscribeUri))
            {
                // Resubscription
                client.Headers.Add("SID", subscriptions[subscribeUri]);
                log.DebugFormat("Resubscribing to {0} with SID {1}", subscribeUri, subscriptions[subscribeUri]);
            }
            else
            {
                client.Headers.Add("CALLBACK", string.Format("<{0}>", localUri));
                client.Headers.Add("NT", "upnp:event");
                log.DebugFormat("New subscribe to {0}", subscribeUri);
            }
            client.Headers.Add("TIMEOUT", "Second-600");

            try
            {
                client.UploadString(subscribeUri, "SUBSCRIBE", string.Empty);
                var sid = client.ResponseHeaders["SID"];
                subscriptions[subscribeUri] = sid;
                timers[subscribeUri] = new Timer(Resubscribe, subscribeUri, TimeSpan.FromSeconds(500), TimeSpan.FromMilliseconds(-1));
            }
            catch (WebException ex)
            {
                log.ErrorFormat("Error subscribing to {0}. {1}", subscribeUri, ex.Message);
                if (subscriptions.ContainsKey(subscribeUri))
                {
                    subscriptions.Remove(subscribeUri);
                    timers[subscribeUri] = new Timer(Resubscribe, subscribeUri, TimeSpan.FromSeconds(10), TimeSpan.FromMilliseconds(-1));
                }
            }
        }