/// <summary> /// Starts activity processing for the current bot turn. /// </summary> /// <param name="turnContext">The turn's context object.</param> /// <param name="callback">A callback method to run at the end of the pipeline.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects /// or threads to receive notice of cancellation.</param> /// <returns>A task that represents the work queued to execute.</returns> /// <exception cref="ArgumentNullException"> /// <paramref name="turnContext"/> is null.</exception> /// <remarks>The adapter calls middleware in the order in which you added it. /// The adapter passes in the context object for the turn and a next delegate, /// and the middleware calls the delegate to pass control to the next middleware /// in the pipeline. Once control reaches the end of the pipeline, the adapter calls /// the <paramref name="callback"/> method. If a middleware component doesn’t call /// the next delegate, the adapter does not call any of the subsequent middleware’s /// <see cref="IMiddleware.OnTurnAsync(ITurnContext, NextDelegate, CancellationToken)"/> /// methods or the callback method, and the pipeline short circuits. /// <para>When the turn is initiated by a user activity (reactive messaging), the /// callback method will be a reference to the bot's /// <see cref="IBot.OnTurnAsync(ITurnContext, CancellationToken)"/> method. When the turn is /// initiated by a call to <see cref="ContinueConversationAsync(string, ConversationReference, BotCallbackHandler, CancellationToken)"/> /// (proactive messaging), the callback method is the callback method that was provided in the call.</para> /// </remarks> protected async Task RunPipelineAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken) { BotAssert.ContextNotNull(turnContext); // Call any registered Middleware Components looking for ReceiveActivityAsync() if (turnContext.Activity != null) { try { await MiddlewareSet.ReceiveActivityWithStatusAsync(turnContext, callback, cancellationToken).ConfigureAwait(false); } catch (Exception e) { if (OnTurnError != null) { await OnTurnError.Invoke(turnContext, e).ConfigureAwait(false); } else { throw; } } } else { // call back to caller on proactive case if (callback != null) { await callback(turnContext, cancellationToken).ConfigureAwait(false); } } }
/// <summary> /// Starts activity processing for the current bot turn. /// </summary> /// <param name="turnContext">The turn's context object.</param> /// <param name="callback">A callback method to run at the end of the pipeline.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects /// or threads to receive notice of cancellation.</param> /// <returns>A task that represents the work queued to execute.</returns> /// <exception cref="ArgumentNullException"> /// <paramref name="turnContext"/> is null.</exception> /// <remarks>The adapter calls middleware in the order in which you added it. /// The adapter passes in the context object for the turn and a next delegate, /// and the middleware calls the delegate to pass control to the next middleware /// in the pipeline. Once control reaches the end of the pipeline, the adapter calls /// the <paramref name="callback"/> method. If a middleware component doesn’t call /// the next delegate, the adapter does not call any of the subsequent middleware’s /// <see cref="IMiddleware.OnTurnAsync(ITurnContext, NextDelegate, CancellationToken)"/> /// methods or the callback method, and the pipeline short circuits. /// <para>When the turn is initiated by a user activity (reactive messaging), the /// callback method will be a reference to the bot's /// <see cref="IBot.OnTurnAsync(ITurnContext, CancellationToken)"/> method. When the turn is /// initiated by a call to <see cref="ContinueConversationAsync(string, ConversationReference, BotCallbackHandler, CancellationToken)"/> /// (proactive messaging), the callback method is the callback method that was provided in the call.</para> /// </remarks> protected async Task RunPipelineAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken) { BotAssert.ContextNotNull(turnContext); // Call any registered Middleware Components looking for ReceiveActivityAsync() if (turnContext.Activity != null) { if (turnContext.Activity.Locale != null) { try { Thread.CurrentThread.CurrentCulture = new CultureInfo(turnContext.Activity.Locale); if (turnContext is TurnContext ctx) { ctx.Locale = turnContext.Activity.Locale; } } catch (CultureNotFoundException) { // if turnContext.Activity.Locale is invalid, then TurnContext.Locale will set to Thread.CurrentThread.CurrentCulture.Name as default. (turnContext as TurnContext).Locale = Thread.CurrentThread.CurrentCulture.Name; } } try { await MiddlewareSet.ReceiveActivityWithStatusAsync(turnContext, callback, cancellationToken).ConfigureAwait(false); } catch (Exception e) { if (OnTurnError != null) { await OnTurnError.Invoke(turnContext, e).ConfigureAwait(false); } else { throw; } } } else { // call back to caller on proactive case if (callback != null) { await callback(turnContext, cancellationToken).ConfigureAwait(false); } } }