public async Task<WnsPushResult> PushAsync(WnsAuthentication authentication, string uri, XmlDocument doc, NotificationType type)
        {
            // create...
            var content = new StringContent(doc.OuterXml);
            content.Headers.ContentType.MediaType = "text/xml";

            // if...
            if(type == NotificationType.Toast)
                content.Headers.Add("X-WNS-Type", "wns/toast");
            else if (type == NotificationType.Tile)
                content.Headers.Add("X-WNS-Type", "wns/tile");
            else if (type == NotificationType.Badge)
                content.Headers.Add("X-WNS-Type", "wns/badge");
            else if (type == NotificationType.Raw)
                content.Headers.Add("X-WNS-Type", "wns/badge");
            else
                throw new NotSupportedException(string.Format("Cannot handle '{0}'.", type));

            // ok...
            var client = authentication.GetHttpClient();
            var response = await client.PostAsync(uri, content);

            // what happened?
            if (response.StatusCode == HttpStatusCode.OK)
            {
                // what happened?
                var all = response.Headers.Where(v => v.Key == "X-WNS-NOTIFICATIONSTATUS").FirstOrDefault();
                if(string.IsNullOrEmpty(all.Key))
                    throw new InvalidOperationException("'X-WNS-NOTIFICATIONSTATUS' header not returned.");
                return (WnsPushResult)Enum.Parse(typeof(WnsPushResult), all.Value.First(), true);
            }
            else
                throw await WnsAuthenticator.CreateRequestException("Failed to post notification.", response);
        }
        private async void buttonAuthenticate_Click(object sender, EventArgs e)
        {
            this.buttonAuthenticate.Enabled = false;
            try
            {
                SaveSettings();

                this.Authentication = null;

                string sid = this.textSid.Text.Trim();
                if (string.IsNullOrEmpty(sid))
                {
                    MessageBox.Show(this, "You must supply a SID.");
                    return;
                }
                string secret = this.textSecret.Text.Trim();
                if (string.IsNullOrEmpty(secret))
                {
                    MessageBox.Show(this, "You must supply a secret");
                    return;
                }

                // get the token...
                var authenticator = new WnsAuthenticator();
                this.Authentication = await authenticator.AuthenticateAsync(sid, secret);

                // et...
                this.textToken.Text = this.Authentication.Token;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString());
            }
            finally
            {
                this.buttonAuthenticate.Enabled = true;
            }
        }
        private async void buttonAuthenticate_Click(object sender, EventArgs e)
        {
            this.buttonAuthenticate.Enabled = false;
            try
            {
                SaveSettings();

                this.Authentication = null;

                string sid = this.textSid.Text.Trim();
                if (string.IsNullOrEmpty(sid))
                {
                    MessageBox.Show(this, "You must supply a SID.");
                    return;
                }
                string secret = this.textSecret.Text.Trim();
                if (string.IsNullOrEmpty(secret))
                {
                    MessageBox.Show(this, "You must supply a secret");
                    return;
                }

                // get the token...
                var authenticator = new WnsAuthenticator();
                this.Authentication = await authenticator.AuthenticateAsync(sid, secret);

                // et...
                this.textToken.Text = this.Authentication.Token;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString());
            }
            finally
            {
                this.buttonAuthenticate.Enabled = true;
            }
        }
 public Task<WnsPushResult> PushAsync(WnsAuthentication authentication, string uri, XmlDocument doc)
 {
     var type = InferNotificationType(doc);
     return PushAsync(authentication, uri, doc, type);
 }
 public Task<WnsPushResult> PushAsync(WnsAuthentication authentication, string uri, string xml)
 {
     var doc = new XmlDocument();
     doc.LoadXml(xml);
     return PushAsync(authentication, uri, doc);
 }