/// <summary> /// Enques all types of WP7 message to each device URI in the subscription. /// </summary> /// <param name="ddm">Device to send message to.</param> /// <param name="messageBytes">Message bytes of the message to send.</param> /// <param name="type">Type of message to send.</param> private void EnqueWP7Notification(DeviceDataModel ddm, byte[] messageBytes, WP7NotificationType type) { // Get the all devices that have signed up for the subscription // Send the message to each device addrress or URI if (Uri.IsWellFormedUriString(ddm.Address, UriKind.Absolute)) { this.SendWP7Message(new Uri(ddm.Address), messageBytes, type); } else { if (this.DeviceIdFormatError != null) { this.DeviceIdFormatError(this, new NotificationEventArgs(new DeviceIdFormatException(ddm.Address))); } } }
/// <summary> /// Send the message out to the device URI. /// </summary> /// <param name="uri">URI of the device to send message to.</param> /// <param name="messageBytes">Bytes of the message.</param> /// <param name="notificationType">Type of the notification - Tile, Toast or Raw.</param> private void SendWP7Message(Uri uri, byte[] messageBytes, WP7NotificationType notificationType) { var request = (HttpWebRequest)WebRequest.Create(uri); request.Method = WebRequestMethods.Http.Post; request.ContentType = "text/xml"; request.ContentLength = messageBytes.Length; request.Headers.Add("X-MessageID", Guid.NewGuid().ToString()); // If the cloud service sending this request is authenticated, it needs to send its certificate. // Otherwise, this step is not needed. // if (_x509Certificate != null) // request.ClientCertificates.Add(_x509Certificate); switch (notificationType) { case WP7NotificationType.Toast: request.Headers["X-WindowsPhone-Target"] = "toast"; request.Headers.Add("X-NotificationClass", ((int)this.ToastInterval).ToString(CultureInfo.InvariantCulture)); break; case WP7NotificationType.Tile: request.Headers["X-WindowsPhone-Target"] = "token"; request.Headers.Add("X-NotificationClass", ((int)this.TileInterval).ToString(CultureInfo.InvariantCulture)); break; case WP7NotificationType.Raw: request.Headers.Add("X-NotificationClass", ((int)this.RawInterval).ToString(CultureInfo.InvariantCulture)); break; } bool sent = false; int tries = 0; HttpWebResponse response; while (!sent && tries < this.retries) { try { using (var requestStream = request.GetRequestStream()) { // we are not using retries yet.. or looking for errors here. We should log errors too. requestStream.Write(messageBytes, 0, messageBytes.Length); } // Sends the notification and gets the response. response = (HttpWebResponse)request.GetResponse(); string notificationStatus = response.Headers["X-NotificationStatus"]; string notificationChannelStatus = response.Headers["X-SubscriptionStatus"]; string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"]; if (response.StatusCode == HttpStatusCode.NotFound) { return; } if (deviceConnectionStatus == "TempDisconnected" || notificationStatus == "QueueFull") { tries++; if (tries > this.retries) { if (this.NotificationFailed != null) { this.NotificationFailed(this, new NotificationEventArgs(new NotificationException(string.Format(CultureInfo.InvariantCulture, "{0} notification failures for {1}. Giving up", this.retries, uri.OriginalString)))); } return; } } else { sent = true; } } catch (WebException e) { // Check why we got the exception if (this.NotificationFailed != null) { this.NotificationFailed(this, new NotificationEventArgs(new NotificationException("Notification failed with exception " + e.Message + "for " + uri.OriginalString, e))); } throw; } } }
private void EnqueWP7Notification(IEnumerable <DeviceDataModel> ddmList, byte[] messageBytes, WP7NotificationType type) { // Get the all devices that have signed up for the subscription // Send the message to each device addrress or URI foreach (DeviceDataModel ddm in ddmList) { if (Uri.IsWellFormedUriString(ddm.Address, UriKind.Absolute)) { try { this.SendWP7Message(new Uri(ddm.Address), messageBytes, type); } catch (WebException e) { HttpWebResponse wr = e.Response as HttpWebResponse; if (wr.StatusCode == HttpStatusCode.NotFound) { this.sds.DeleteDeviceSubscriptions(ddm); } } } else { if (this.DeviceIdFormatError != null) { this.DeviceIdFormatError(this, new NotificationEventArgs(new DeviceIdFormatException(ddm.Address))); } } } }
private void EnqueWP7Notification(IEnumerable<DeviceDataModel> ddmList, byte[] messageBytes, WP7NotificationType type) { // Get the all devices that have signed up for the subscription // Send the message to each device addrress or URI foreach (DeviceDataModel ddm in ddmList) { if (Uri.IsWellFormedUriString(ddm.Address, UriKind.Absolute)) { try { this.SendWP7Message(new Uri(ddm.Address), messageBytes, type); } catch (WebException e) { HttpWebResponse wr = e.Response as HttpWebResponse; if (wr.StatusCode == HttpStatusCode.NotFound) { this.sds.DeleteDeviceSubscriptions(ddm); } } } else { if (this.DeviceIdFormatError != null) { this.DeviceIdFormatError(this, new NotificationEventArgs(new DeviceIdFormatException(ddm.Address))); } } } }