/// <summary> /// Sends a message to the FCM service for delivery. The message gets validated both by /// the Admin SDK, and the remote FCM service. A successful return value indicates /// that the message has been successfully sent to FCM, where it has been accepted by the /// FCM service. /// </summary> /// <returns>A task that completes with a message ID string, which represents /// successful handoff to FCM.</returns> /// <exception cref="ArgumentNullException">If the message argument is null.</exception> /// <exception cref="ArgumentException">If the message contains any invalid /// fields.</exception> /// <exception cref="FirebaseMessagingException">If an error occurs while sending the /// message.</exception> /// <param name="message">The message to be sent. Must not be null.</param> /// <param name="dryRun">A boolean indicating whether to perform a dry run (validation /// only) of the send. If set to true, the message will be sent to the FCM backend service, /// but it will not be delivered to any actual recipients.</param> /// <param name="cancellationToken">A cancellation token to monitor the asynchronous /// operation.</param> public async Task <string> SendAsync( Message message, bool dryRun = false, CancellationToken cancellationToken = default(CancellationToken)) { var request = new SendRequest() { Message = message.ThrowIfNull(nameof(message)).CopyAndValidate(), ValidateOnly = dryRun, }; try { var response = await this.SendRequestAsync(request, cancellationToken).ConfigureAwait(false); var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); this.errorHandler.ThrowIfError(response, json); var parsed = JsonConvert.DeserializeObject <SingleMessageResponse>(json); return(parsed.Name); } catch (HttpRequestException e) { throw this.ToFirebaseMessagingException(e); } }
/// <summary> /// Sends a message to the FCM service for delivery. The message gets validated both by /// the Admin SDK, and the remote FCM service. A successful return value indicates /// that the message has been successfully sent to FCM, where it has been accepted by the /// FCM service. /// </summary> /// <returns>A task that completes with a message ID string, which represents /// successful handoff to FCM.</returns> /// <exception cref="ArgumentNullException">If the message argument is null.</exception> /// <exception cref="ArgumentException">If the message contains any invalid /// fields.</exception> /// <exception cref="FirebaseException">If an error occurs while sending the /// message.</exception> /// <param name="message">The message to be sent. Must not be null.</param> /// <param name="dryRun">A boolean indicating whether to perform a dry run (validation /// only) of the send. If set to true, the message will be sent to the FCM backend service, /// but it will not be delivered to any actual recipients.</param> /// <param name="cancellationToken">A cancellation token to monitor the asynchronous /// operation.</param> public async Task <string> SendAsync( Message message, bool dryRun = false, CancellationToken cancellationToken = default(CancellationToken)) { var request = new SendRequest() { Message = message.ThrowIfNull(nameof(message)).CopyAndValidate(), ValidateOnly = dryRun, }; try { var response = await this.SendRequestAsync(request, cancellationToken).ConfigureAwait(false); var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); if (!response.IsSuccessStatusCode) { // TODO(hkj): Handle error responses. var error = "Response status code does not indicate success: " + $"{(int)response.StatusCode} ({response.StatusCode})" + $"{Environment.NewLine}{json}"; throw new FirebaseException(error); } var parsed = JsonConvert.DeserializeObject <SingleMessageResponse>(json); return(parsed.Name); } catch (HttpRequestException e) { throw e.ToFirebaseException(); } }
/// <summary> /// Sends a message to the FCM service for delivery. The message gets validated both by /// the Admin SDK, and the remote FCM service. A successful return value indicates /// that the message has been successfully sent to FCM, where it has been accepted by the /// FCM service. /// </summary> /// <returns>A task that completes with a message ID string, which represents /// successful handoff to FCM.</returns> /// <exception cref="ArgumentNullException">If the message argument is null.</exception> /// <exception cref="ArgumentException">If the message contains any invalid /// fields.</exception> /// <exception cref="FirebaseMessagingException">If an error occurs while sending the /// message.</exception> /// <param name="message">The message to be sent. Must not be null.</param> /// <param name="dryRun">A boolean indicating whether to perform a dry run (validation /// only) of the send. If set to true, the message will be sent to the FCM backend service, /// but it will not be delivered to any actual recipients.</param> /// <param name="cancellationToken">A cancellation token to monitor the asynchronous /// operation.</param> public async Task <string> SendAsync( Message message, bool dryRun = false, CancellationToken cancellationToken = default(CancellationToken)) { var body = new SendRequest() { Message = message.ThrowIfNull(nameof(message)).CopyAndValidate(), ValidateOnly = dryRun, }; var request = new HttpRequestMessage() { Method = HttpMethod.Post, RequestUri = new Uri(this.sendUrl), Content = NewtonsoftJsonSerializer.Instance.CreateJsonHttpContent(body), }; AddCommonHeaders(request); var response = await this.httpClient .SendAndDeserializeAsync <SingleMessageResponse>(request, cancellationToken) .ConfigureAwait(false); return(response.Result.Name); }