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)); }
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); } } }