async Task <HandoffRequest> IHandoffAdapter.InitiateHandoffAsync(ITurnContext turnContext, Activity[] activities, object handoffContext, CancellationToken cancellationToken)
        {
            var connectorClient = turnContext.TurnState.Get <IConnectorClient>();

            string conversationId    = turnContext.Activity.Conversation.Id;
            var    handoffParameters = new HandoffParameters(new Transcript {
                Activities = activities
            }, handoffContext);
            var response = await HandoffHttpSupport.HandoffWithHttpMessagesAsync((IServiceOperations <ConnectorClient>) connectorClient.Conversations, conversationId, handoffParameters, cancellationToken).ConfigureAwait(false);

            return(new HandoffRequest(conversationId, connectorClient.Conversations));
        }
Ejemplo n.º 2
0
        public static async Task <HttpOperationResponse <ResourceResponse> > HandoffWithHttpMessagesAsync(IServiceOperations <ConnectorClient> conversations, string conversationId, HandoffParameters handoffParameters, CancellationToken cancellationToken = default)
        {
            if (conversationId == null)
            {
                throw new ArgumentNullException(nameof(conversationId));
            }

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

            // Construct URL
            var baseUrl = conversations.Client.BaseUri.AbsoluteUri;

            if (!baseUrl.EndsWith("/"))
            {
                baseUrl += "/";
            }

            var url = new Uri($"{baseUrl}v3/conversations/{Uri.EscapeDataString(conversationId)}/handoff");

            using (var httpRequest = new HttpRequestMessage())
            {
                httpRequest.Method     = HttpMethod.Post;
                httpRequest.RequestUri = url;

                // Serialize Request
                string requestContent = null;
                requestContent      = Rest.Serialization.SafeJsonConvert.SerializeObject(handoffParameters, conversations.Client.SerializationSettings);
                httpRequest.Content = new StringContent(requestContent, System.Text.Encoding.UTF8);
                httpRequest.Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json; charset=utf-8");

                cancellationToken.ThrowIfCancellationRequested();

                // Set Credentials
                if (conversations.Client.Credentials != null)
                {
                    await conversations.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false);
                }

                using (var httpResponse = await conversations.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false))
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    string responseContent;
                    if (httpResponse.StatusCode != HttpStatusCode.OK)
                    {
                        var ex = new ErrorResponseException(string.Format("Operation returned an invalid status code '{0}'", httpResponse.StatusCode));

                        responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                        ErrorResponse errorBody = Rest.Serialization.SafeJsonConvert.DeserializeObject <ErrorResponse>(responseContent, conversations.Client.DeserializationSettings);
                        if (errorBody != null)
                        {
                            ex.Body = errorBody;
                        }

                        ex.Request  = new HttpRequestMessageWrapper(httpRequest, requestContent);
                        ex.Response = new HttpResponseMessageWrapper(httpResponse, responseContent);
                        throw ex;
                    }

                    // Create Result
                    var result = new HttpOperationResponse <ResourceResponse>
                    {
                        Request  = httpRequest,
                        Response = httpResponse,
                    };

                    // Deserialize Response
                    responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                    try
                    {
                        result.Body = Rest.Serialization.SafeJsonConvert.DeserializeObject <ResourceResponse>(responseContent, conversations.Client.DeserializationSettings);
                    }
                    catch (JsonException ex)
                    {
                        throw new SerializationException("Unable to deserialize the response.", responseContent, ex);
                    }

                    return(result);
                }
            }
        }