public override async Task DeleteActivityAsync(ITurnContext turnContext, ConversationReference reference, CancellationToken cancellationToken)
        {
            var requestPath = $"/activities/{reference.ActivityId}";
            var request     = StreamingRequest.CreateDelete(requestPath);

            _botTelemetryClient.TrackTrace($"Deleting activity. activity id: {reference.ActivityId}", Severity.Information, null);

            var stopWatch = new Diagnostics.Stopwatch();

            try
            {
                stopWatch.Start();
                await SendRequestAsync <ResourceResponse>(request, cancellationToken).ConfigureAwait(false);

                stopWatch.Stop();
            }
            catch (Exception ex)
            {
                throw new SkillWebSocketCallbackException($"Callback failed. Verb: DELETE, Path: {requestPath}", ex);
            }

            _botTelemetryClient.TrackEvent("SkillWebSocketDeleteActivityLatency", null, new Dictionary <string, double>
            {
                { "Latency", stopWatch.ElapsedMilliseconds },
            });
        }
        public void Request_Create_Delete_Success()
        {
            var r = StreamingRequest.CreateDelete();

            Assert.AreEqual(StreamingRequest.DELETE, r.Verb);
            Assert.IsNull(r.Path);
            Assert.IsNull(r.Streams);
        }
        /// <summary>
        /// Deletes an existing member in the conversation.
        /// Throws <see cref="ArgumentNullException"/> if conversationId or memberId is null, empty, or whitespace.
        /// </summary>
        /// <param name="conversationId">Conversation reference for the activity to delete.</param>
        /// <param name="memberId">The id of the member to be deleted.</param>
        /// <param name="cancellationToken">Optional cancellation token.</param>
        /// <returns>A task that represents the work queued to execute.</returns>
        public async Task <HttpOperationResponse> DeleteConversationMemberAsync(string conversationId, string memberId, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (string.IsNullOrWhiteSpace(conversationId))
            {
                throw new ArgumentNullException(nameof(conversationId));
            }

            if (string.IsNullOrWhiteSpace(memberId))
            {
                throw new ArgumentNullException(nameof(memberId));
            }

            var route   = $"{StreamingChannelPrefix}{conversationId}/members/{memberId}";
            var request = StreamingRequest.CreateDelete(route);

            return(await SendRequestAsync <HttpOperationResponse>(request, cancellationToken).ConfigureAwait(false));
        }
        /// <summary>
        /// Deletes an existing activity in the conversation.
        /// Throws <see cref="ArgumentNullException"/> if any required argument is null.
        /// </summary>
        /// <param name="turnContext">The context object for the turn.</param>
        /// <param name="reference">Conversation reference for the activity to delete.</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <returns>A task that represents the work queued to execute.</returns>
        /// <remarks>The <see cref="ConversationReference.ActivityId"/> of the conversation
        /// reference identifies the activity to delete.</remarks>
        /// <seealso cref="ITurnContext.OnDeleteActivity(DeleteActivityHandler)"/>
        public override async Task DeleteActivityAsync(ITurnContext turnContext, ConversationReference reference, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (turnContext == null)
            {
                throw new ArgumentNullException(nameof(turnContext));
            }

            if (reference == null)
            {
                throw new ArgumentNullException(nameof(reference));
            }

            var requestPath = $"{StreamingChannelPrefix}{reference.Conversation.Id}/activities/{reference.ActivityId}";
            var request     = StreamingRequest.CreateDelete(requestPath);

            await SendRequestAsync <ResourceResponse>(request, cancellationToken).ConfigureAwait(false);
        }