public async Task <AlexaResponseBody> ProcessActivity(AlexaRequestBody alexaRequest, AlexaOptions alexaOptions, BotCallbackHandler callback) { TurnContext context = null; try { Options = alexaOptions; var activity = RequestToActivity(alexaRequest); BotAssert.ActivityNotNull(activity); context = new TurnContext(this, activity); if (alexaRequest.Session.Attributes != null && alexaRequest.Session.Attributes.Any()) { context.TurnState.Add("AlexaSessionAttributes", alexaRequest.Session.Attributes); } else { context.TurnState.Add("AlexaSessionAttributes", new Dictionary <string, string>()); } context.TurnState.Add("AlexaResponseDirectives", new List <IAlexaDirective>()); Responses = new Dictionary <string, List <Activity> >(); await base.RunPipelineAsync(context, callback, default(CancellationToken)).ConfigureAwait(false); var key = $"{activity.Conversation.Id}:{activity.Id}"; try { AlexaResponseBody response = null; var activities = Responses.ContainsKey(key) ? Responses[key] : new List <Activity>(); response = CreateResponseFromLastActivity(activities, context); response.SessionAttributes = context.AlexaSessionAttributes(); return(response); } finally { if (Responses.ContainsKey(key)) { Responses.Remove(key); } } } catch (Exception ex) { await alexaOptions.OnTurnError(context, ex); throw; } }