diff --git a/Libraries/Microsoft.Teams.AI.Models.OpenAI/OpenAIChatModel.Send.cs b/Libraries/Microsoft.Teams.AI.Models.OpenAI/OpenAIChatModel.Send.cs index fdbc1b31d..e7b8b2512 100644 --- a/Libraries/Microsoft.Teams.AI.Models.OpenAI/OpenAIChatModel.Send.cs +++ b/Libraries/Microsoft.Teams.AI.Models.OpenAI/OpenAIChatModel.Send.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Text; @@ -19,14 +19,14 @@ public async Task Send(IMessage message, ChatCompletionOptions? option { Functions = [], Messages = [] - }, cancellationToken); + }, cancellationToken).ConfigureAwait(false); return res; } public async Task> Send(IMessage message, ChatModelOptions options, CancellationToken cancellationToken = default) { - var messages = await CallFunctions(message, options, cancellationToken); + var messages = await CallFunctions(message, options, cancellationToken).ConfigureAwait(false); var chatMessages = messages.Select(m => m.ToOpenAI()).ToList(); if (options.Prompt is not null) @@ -48,14 +48,14 @@ public async Task> Send(IMessage message, ChatModelOptions< var result = await ChatClient.CompleteChatAsync( chatMessages, requestOptions, - CancellationToken.None - ); + cancellationToken + ).ConfigureAwait(false); var modelMessage = ChatMessage.CreateAssistantMessage(result.Value).ToTeams(); if (modelMessage.HasFunctionCalls) { - return await Send(modelMessage, options, cancellationToken); + return await Send(modelMessage, options, cancellationToken).ConfigureAwait(false); } messages.Add(modelMessage); @@ -70,7 +70,7 @@ public async Task> Send(IMessage message, ChatModelOptions< public async Task> Send(IMessage message, ChatModelOptions options, IStream stream, CancellationToken cancellationToken = default) { - var messages = await CallFunctions(message, options, cancellationToken); + var messages = await CallFunctions(message, options, cancellationToken).ConfigureAwait(false); var chatMessages = messages.Select(m => m.ToOpenAI()).ToList(); if (options.Prompt is not null) @@ -89,7 +89,7 @@ public async Task> Send(IMessage message, ChatModelOptions< requestOptions.Tools.Add(tool); } - var res = ChatClient.CompleteChatStreamingAsync(chatMessages, requestOptions, CancellationToken.None); + var res = ChatClient.CompleteChatStreamingAsync(chatMessages, requestOptions, cancellationToken); var content = new StringBuilder(); var toolCalls = new StreamingChatToolCallsBuilder(); @@ -108,12 +108,12 @@ public async Task> Send(IMessage message, ChatModelOptions< } content.Append(delta); - stream.Emit(delta.ToString()); + await stream.EmitAsync(delta.ToString()).ConfigureAwait(false); if (chunk.FinishReason == ChatFinishReason.ToolCalls) { var input = ChatMessage.CreateAssistantMessage(toolCalls.Build()).ToTeams(); - return await Send(input, options, stream, cancellationToken); + return await Send(input, options, stream, cancellationToken).ConfigureAwait(false); } else if (chunk.FinishReason == ChatFinishReason.Length) { @@ -152,7 +152,7 @@ protected async Task> CallFunctions(IMessage message, ChatModelO try { var args = call.Parse() ?? new Dictionary(); - var res = await options.Invoke(call, cancellationToken); + var res = await options.Invoke(call, cancellationToken).ConfigureAwait(false); content = res is string asString ? asString : JsonSerializer.Serialize(res); logger.Debug(content); diff --git a/Libraries/Microsoft.Teams.AI/BaseChatPlugin.cs b/Libraries/Microsoft.Teams.AI/BaseChatPlugin.cs index a6a2c4466..adec47a27 100644 --- a/Libraries/Microsoft.Teams.AI/BaseChatPlugin.cs +++ b/Libraries/Microsoft.Teams.AI/BaseChatPlugin.cs @@ -37,7 +37,7 @@ public virtual Task OnBuildFunctions(IChatPrompt OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions) + public virtual Task OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions, CancellationToken cancellationToken = default) { return Task.FromResult(instructions); } diff --git a/Libraries/Microsoft.Teams.AI/ChatPlugin.cs b/Libraries/Microsoft.Teams.AI/ChatPlugin.cs index b67d9bf89..c33438868 100644 --- a/Libraries/Microsoft.Teams.AI/ChatPlugin.cs +++ b/Libraries/Microsoft.Teams.AI/ChatPlugin.cs @@ -67,5 +67,5 @@ public interface IChatPlugin /// the prompt /// the instructions /// the transformed instructions - public Task OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions); + public Task OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Chain.cs b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Chain.cs index 128b8f74c..5bdbfe569 100644 --- a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Chain.cs +++ b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Chain.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Json.Schema; @@ -22,7 +22,7 @@ public ChatPrompt Chain(IChatPrompt prompt) ), async (string text) => { - var res = await prompt.Send(text); + var res = await prompt.Send(text).ConfigureAwait(false); return res.Content; } )); diff --git a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Errors.cs b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Errors.cs index 60fc2fb99..68b59f357 100644 --- a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Errors.cs +++ b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Errors.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. namespace Microsoft.Teams.AI.Prompts; @@ -13,7 +13,16 @@ public IChatPrompt OnError(Action onError) public IChatPrompt OnError(Func onError) { - ErrorEvent += (_, ex) => onError(ex).GetAwaiter().GetResult(); + ErrorEvent += (_, ex) => + { + _ = onError(ex).ContinueWith(t => + { + if (t.IsFaulted) + { + Logger.Error(t.Exception); + } + }, TaskScheduler.Default); + }; return this; } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Functions.cs b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Functions.cs index 357933704..d501e36f8 100644 --- a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Functions.cs +++ b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Functions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Humanizer; @@ -36,7 +36,7 @@ public ChatPrompt Function(string name, string? description, JsonSchem public Func> Invoke(FunctionCollection functions) { - return async (call, cancellationToken) => await _Invoke(call, functions, cancellationToken); + return async (call, cancellationToken) => await _Invoke(call, functions, cancellationToken).ConfigureAwait(false); } private async Task _Invoke(FunctionCall call, FunctionCollection functions, CancellationToken cancellationToken = default) @@ -48,13 +48,13 @@ public ChatPrompt Function(string name, string? description, JsonSchem { foreach (var plugin in Plugins) { - call = await plugin.OnBeforeFunctionCall(this, func, call, cancellationToken); + call = await plugin.OnBeforeFunctionCall(this, func, call, cancellationToken).ConfigureAwait(false); } var startedAt = DateTime.Now; logger.Debug(call.Arguments); - var res = await func.Invoke(call); + var res = await func.Invoke(call).ConfigureAwait(false); var endedAt = DateTime.Now; logger.Debug(res); @@ -62,7 +62,7 @@ public ChatPrompt Function(string name, string? description, JsonSchem foreach (var plugin in Plugins) { - res = await plugin.OnAfterFunctionCall(this, func, call, res, cancellationToken); + res = await plugin.OnAfterFunctionCall(this, func, call, res, cancellationToken).ConfigureAwait(false); } return res; diff --git a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Send.cs b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Send.cs index 90075037a..34c183bab 100644 --- a/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Send.cs +++ b/Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Send.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.AI.Messages; @@ -10,17 +10,17 @@ public partial class ChatPrompt { public async Task Send(IMessage message, CancellationToken cancellationToken = default) { - return await Send(message, null, null, cancellationToken); + return await Send(message, null, null, cancellationToken).ConfigureAwait(false); } public async Task> Send(string text, CancellationToken cancellationToken = default) { - return await Send(text, null, null, cancellationToken); + return await Send(text, null, null, cancellationToken).ConfigureAwait(false); } public async Task> Send(string text, OnStreamChunk? onChunk, CancellationToken cancellationToken = default) { - return await Send(text, null, onChunk, cancellationToken); + return await Send(text, null, onChunk, cancellationToken).ConfigureAwait(false); } public Task> Send(string text, IChatPrompt.RequestOptions? options, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default) @@ -49,7 +49,7 @@ public async Task> Send(IMessage message, IChatPrompt requestOptions = new(Invoke(functions)) @@ -94,23 +94,23 @@ async Task OnChunk(string chunk) foreach (var plugin in Plugins) { - message = await plugin.OnBeforeSend(this, message, requestOptions.Options, cancellationToken); + message = await plugin.OnBeforeSend(this, message, requestOptions.Options, cancellationToken).ConfigureAwait(false); } if (onChunk is null) { - res = await Model.Send(message, requestOptions, cancellationToken); + res = await Model.Send(message, requestOptions, cancellationToken).ConfigureAwait(false); } else { - res = await Model.Send(message, requestOptions, new Stream(OnChunk), cancellationToken); + res = await Model.Send(message, requestOptions, new Stream(OnChunk), cancellationToken).ConfigureAwait(false); } Logger.Debug(res); foreach (var plugin in Plugins) { - res = (ModelMessage)await plugin.OnAfterSend(this, res, requestOptions.Options, cancellationToken); + res = (ModelMessage)await plugin.OnAfterSend(this, res, requestOptions.Options, cancellationToken).ConfigureAwait(false); } return res; diff --git a/Libraries/Microsoft.Teams.AI/Stream.cs b/Libraries/Microsoft.Teams.AI/Stream.cs index e221e1533..c5100df96 100644 --- a/Libraries/Microsoft.Teams.AI/Stream.cs +++ b/Libraries/Microsoft.Teams.AI/Stream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. namespace Microsoft.Teams.AI; @@ -21,6 +21,16 @@ public interface IStream /// /// the text chunk public void Emit(string text); + + /// + /// emit a text chunk asynchronously + /// + /// the text chunk + public Task EmitAsync(string text) + { + Emit(text); + return Task.CompletedTask; + } } /// @@ -29,8 +39,14 @@ public interface IStream [Obsolete("Microsoft.Teams.AI is deprecated and will be removed by end of summer 2026.")] public class Stream(OnStreamChunk onChunk) : IStream { + [Obsolete("Use EmitAsync instead to avoid sync-over-async blocking.")] public void Emit(string text) { onChunk(text).GetAwaiter().GetResult(); } -} \ No newline at end of file + + public Task EmitAsync(string text) + { + return onChunk(text); + } +} diff --git a/Libraries/Microsoft.Teams.Api/Auth/ClientCredentials.cs b/Libraries/Microsoft.Teams.Api/Auth/ClientCredentials.cs index e198eb73d..c95feb252 100644 --- a/Libraries/Microsoft.Teams.Api/Auth/ClientCredentials.cs +++ b/Libraries/Microsoft.Teams.Api/Auth/ClientCredentials.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -41,7 +41,7 @@ public async Task Resolve(IHttpClient client, string[] scopes, C { "scope", string.Join(",", scopes) } }; - var res = await client.SendAsync(request, cancellationToken); + var res = await client.SendAsync(request, cancellationToken).ConfigureAwait(false); return res.Body; } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Auth/TokenCredentials.cs b/Libraries/Microsoft.Teams.Api/Auth/TokenCredentials.cs index 238e6f0ac..3df7a9a15 100644 --- a/Libraries/Microsoft.Teams.Api/Auth/TokenCredentials.cs +++ b/Libraries/Microsoft.Teams.Api/Auth/TokenCredentials.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -28,6 +28,6 @@ public TokenCredentials(string clientId, string tenantId, TokenFactory token) public async Task Resolve(IHttpClient _client, string[] scopes, CancellationToken cancellationToken = default) { - return await Token(TenantId, scopes); + return await Token(TenantId, scopes).ConfigureAwait(false); } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs index 80b17ece6..912d6963d 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Diagnostics.CodeAnalysis; @@ -41,7 +41,7 @@ public ActivityClient(string serviceUrl, IHttpClientFactory factory, Cancellatio body: activity ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); if (res.Body == string.Empty) return null; @@ -57,7 +57,7 @@ public ActivityClient(string serviceUrl, IHttpClientFactory factory, Cancellatio body: activity ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); if (res.Body == string.Empty) return null; @@ -74,7 +74,7 @@ public ActivityClient(string serviceUrl, IHttpClientFactory factory, Cancellatio body: activity ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); if (res.Body == string.Empty) return null; @@ -89,7 +89,7 @@ public async Task DeleteAsync(string conversationId, string id, CancellationToke $"{ServiceUrl}v3/conversations/{conversationId}/activities/{id}" ); - await _http.SendAsync(req, token); + await _http.SendAsync(req, token).ConfigureAwait(false); } /// @@ -109,7 +109,7 @@ public async Task DeleteAsync(string conversationId, string id, CancellationToke body: activity ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); if (res.Body == string.Empty) return null; @@ -134,7 +134,7 @@ public async Task DeleteAsync(string conversationId, string id, CancellationToke body: activity ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); if (res.Body == string.Empty) return null; @@ -156,6 +156,6 @@ public async Task DeleteTargetedAsync(string conversationId, string id, Cancella $"{ServiceUrl}v3/conversations/{conversationId}/activities/{id}?isTargetedActivity=true" ); - await _http.SendAsync(req, token); + await _http.SendAsync(req, token).ConfigureAwait(false); } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/BotSignInClient.cs b/Libraries/Microsoft.Teams.Api/Clients/BotSignInClient.cs index 716b02945..c46f89854 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/BotSignInClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/BotSignInClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -37,7 +37,7 @@ public async Task GetUrlAsync(GetUrlRequest request, CancellationToken c $"{TokenServiceUrl}/api/botsignin/GetSignInUrl?{query}" ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); return res.Body; } @@ -49,7 +49,7 @@ public async Task GetUrlAsync(GetUrlRequest request, CancellationToken c $"{TokenServiceUrl}/api/botsignin/GetSignInResource?{query}" ); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); return res.Body; } diff --git a/Libraries/Microsoft.Teams.Api/Clients/BotTokenClient.cs b/Libraries/Microsoft.Teams.Api/Clients/BotTokenClient.cs index e4870df58..9a173c293 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/BotTokenClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/BotTokenClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -40,12 +40,12 @@ public BotTokenClient(IHttpClientFactory factory, CancellationToken cancellation public virtual async Task GetAsync(IHttpCredentials credentials, IHttpClient? http = null, CancellationToken cancellationToken = default) { var token = cancellationToken != default ? cancellationToken : _cancellationToken; - return await credentials.Resolve(http ?? _http, [ActiveBotScope], token); + return await credentials.Resolve(http ?? _http, [ActiveBotScope], token).ConfigureAwait(false); } public async Task GetGraphAsync(IHttpCredentials credentials, IHttpClient? http = null, CancellationToken cancellationToken = default) { var token = cancellationToken != default ? cancellationToken : _cancellationToken; - return await credentials.Resolve(http ?? _http, [ActiveGraphScope], token); + return await credentials.Resolve(http ?? _http, [ActiveGraphScope], token).ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs index eea23726a..1f5a45e3b 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Text.Json.Serialization; @@ -51,7 +51,7 @@ public async Task CreateAsync(CreateRequest request, Cance { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var req = HttpRequest.Post($"{ServiceUrl}v3/conversations", body: request); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); return res.Body; } diff --git a/Libraries/Microsoft.Teams.Api/Clients/MeetingClient.cs b/Libraries/Microsoft.Teams.Api/Clients/MeetingClient.cs index 2fc1dc807..3c6e40d07 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/MeetingClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/MeetingClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Text.Json.Serialization; @@ -36,7 +36,7 @@ public async Task GetByIdAsync(string id, CancellationToken cancellatio { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v1/meetings/{id}"); - var response = await _http.SendAsync(request, token); + var response = await _http.SendAsync(request, token).ConfigureAwait(false); return response.Body; } @@ -44,7 +44,7 @@ public async Task GetParticipantAsync(string meetingId, stri { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v1/meetings/{Uri.EscapeDataString(meetingId)}/participants/{Uri.EscapeDataString(id)}?tenantId={Uri.EscapeDataString(tenantId)}"); - var response = await _http.SendAsync(request, token); + var response = await _http.SendAsync(request, token).ConfigureAwait(false); return response.Body; } } diff --git a/Libraries/Microsoft.Teams.Api/Clients/MemberClient.cs b/Libraries/Microsoft.Teams.Api/Clients/MemberClient.cs index f44fc24f7..fe734b139 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/MemberClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/MemberClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -33,7 +33,7 @@ public async Task> GetAsync(string conversationId, CancellationTok { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v3/conversations/{conversationId}/members"); - var response = await _http.SendAsync>(request, token); + var response = await _http.SendAsync>(request, token).ConfigureAwait(false); return response.Body; } @@ -41,7 +41,7 @@ public async Task GetByIdAsync(string conversationId, string memberId, { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v3/conversations/{conversationId}/members/{memberId}"); - var response = await _http.SendAsync(request, token); + var response = await _http.SendAsync(request, token).ConfigureAwait(false); return response.Body; } @@ -50,6 +50,6 @@ public async Task DeleteAsync(string conversationId, string memberId, Cancellati { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Delete($"{ServiceUrl}v3/conversations/{conversationId}/members/{memberId}"); - await _http.SendAsync(request, token); + await _http.SendAsync(request, token).ConfigureAwait(false); } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs index 762a87272..ad8202bf8 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs @@ -60,7 +60,7 @@ public async Task AddAsync( // PUT v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType} var url = $"{ServiceUrl}v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType}"; var req = HttpRequest.Put(url); - await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken); + await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken).ConfigureAwait(false); } /// @@ -89,6 +89,6 @@ public async Task DeleteAsync( var req = HttpRequest.Delete(url); - await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken); + await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken).ConfigureAwait(false); } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/TeamClient.cs b/Libraries/Microsoft.Teams.Api/Clients/TeamClient.cs index 4842628a6..3aac42683 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/TeamClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/TeamClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Common.Http; @@ -33,7 +33,7 @@ public async Task GetByIdAsync(string id, CancellationToken cancellationTo { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v3/teams/{id}"); - var response = await _http.SendAsync(request, token); + var response = await _http.SendAsync(request, token).ConfigureAwait(false); return response.Body; } @@ -41,7 +41,7 @@ public async Task> GetConversationsAsync(string id, CancellationTo { var token = cancellationToken != default ? cancellationToken : _cancellationToken; var request = HttpRequest.Get($"{ServiceUrl}v3/teams/{id}/conversations"); - var response = await _http.SendAsync>(request, token); + var response = await _http.SendAsync>(request, token).ConfigureAwait(false); return response.Body; } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/UserTokenClient.cs b/Libraries/Microsoft.Teams.Api/Clients/UserTokenClient.cs index 2a476dfcd..3050acd46 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/UserTokenClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/UserTokenClient.cs @@ -42,7 +42,7 @@ public UserTokenClient(IHttpClientFactory factory, CancellationToken cancellatio var token = cancellationToken != default ? cancellationToken : _cancellationToken; var query = QueryString.Serialize(request); var req = HttpRequest.Get($"{TokenServiceUrl}/api/usertoken/GetToken?{query}"); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); return res.Body; } @@ -51,7 +51,7 @@ public UserTokenClient(IHttpClientFactory factory, CancellationToken cancellatio var token = cancellationToken != default ? cancellationToken : _cancellationToken; var query = QueryString.Serialize(request); var req = HttpRequest.Post($"{TokenServiceUrl}/api/usertoken/GetAadTokens?{query}", body: request); - var res = await _http.SendAsync>(req, token); + var res = await _http.SendAsync>(req, token).ConfigureAwait(false); return res.Body; } @@ -60,7 +60,7 @@ public UserTokenClient(IHttpClientFactory factory, CancellationToken cancellatio var token = cancellationToken != default ? cancellationToken : _cancellationToken; var query = QueryString.Serialize(request); var req = HttpRequest.Get($"{TokenServiceUrl}/api/usertoken/GetTokenStatus?{query}"); - var res = await _http.SendAsync>(req, token); + var res = await _http.SendAsync>(req, token).ConfigureAwait(false); return res.Body; } @@ -69,7 +69,7 @@ public async Task SignOutAsync(SignOutRequest request, CancellationToken cancell var token = cancellationToken != default ? cancellationToken : _cancellationToken; var query = QueryString.Serialize(request); var req = HttpRequest.Delete($"{TokenServiceUrl}/api/usertoken/SignOut?{query}"); - await _http.SendAsync(req, token); + await _http.SendAsync(req, token).ConfigureAwait(false); } public async Task ExchangeAsync(ExchangeTokenRequest request, CancellationToken cancellationToken = default) @@ -89,7 +89,7 @@ public async Task SignOutAsync(SignOutRequest request, CancellationToken cancell var req = HttpRequest.Post($"{TokenServiceUrl}/api/usertoken/exchange?{query}", body); req.Headers.Add("Content-Type", new List() { "application/json" }); - var res = await _http.SendAsync(req, token); + var res = await _http.SendAsync(req, token).ConfigureAwait(false); return res.Body; } @@ -181,4 +181,4 @@ public class ExchangeTokenRequest internal TokenExchange.Request GetBody() => ExchangeRequest; } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Apps.Testing/Plugins/TestPlugin.cs b/Libraries/Microsoft.Teams.Apps.Testing/Plugins/TestPlugin.cs index be2a1a49b..02d058312 100644 --- a/Libraries/Microsoft.Teams.Apps.Testing/Plugins/TestPlugin.cs +++ b/Libraries/Microsoft.Teams.Apps.Testing/Plugins/TestPlugin.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Net; @@ -147,7 +147,7 @@ public async Task Do(IToken token, IActivity activity, IDictionary Do(ActivityEvent @event, CancellationToken cancellationToken = default) @@ -161,7 +161,7 @@ await Events( "message", new TestMessageEvent() { Message = message.Text }, cancellationToken - ); + ).ConfigureAwait(false); } var @out = await Events( @@ -169,7 +169,7 @@ await Events( EventType.Activity, @event, cancellationToken - ); + ).ConfigureAwait(false); var res = (Response?)@out; @@ -187,7 +187,7 @@ await Events( EventType.Error, new ErrorEvent() { Exception = ex }, cancellationToken - ); + ).ConfigureAwait(false); return new(HttpStatusCode.InternalServerError, ex.ToString()); } diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Activity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Activity.cs index ef110d9ef..94ce4888d 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Activity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Activity.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Api.Activities; @@ -23,7 +23,7 @@ public static App OnActivity(this App app, Func, Task> handl { app.Router.Register(async (context) => { - await handler(context); + await handler(context).ConfigureAwait(false); return null; }); @@ -34,7 +34,7 @@ public static App OnActivity(this App app, Func, Cancellatio { app.Router.Register(async (context) => { - await handler(context, context.CancellationToken); + await handler(context, context.CancellationToken).ConfigureAwait(false); return null; }); @@ -63,7 +63,7 @@ public static App OnActivity(this App app, ActivityType type, Func { - await handler(context); + await handler(context).ConfigureAwait(false); return null; }, Selector = (activity) => activity.Type.Equals(type), @@ -80,7 +80,7 @@ public static App OnActivity(this App app, ActivityType type, Func { - await handler(context, context.CancellationToken); + await handler(context, context.CancellationToken).ConfigureAwait(false); return null; }, Selector = (activity) => activity.Type.Equals(type), @@ -125,7 +125,7 @@ public static App OnActivity(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async (context) => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = (activity) => activity.GetType() == typeof(TActivity), @@ -142,7 +142,7 @@ public static App OnActivity(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async (context) => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = (activity) => activity.GetType() == typeof(TActivity), @@ -188,7 +188,7 @@ public static App OnActivity(this App app, Func select, Func { - await handler(context); + await handler(context).ConfigureAwait(false); return null; } }); @@ -205,7 +205,7 @@ public static App OnActivity(this App app, Func select, Func { - await handler(context, context.CancellationToken); + await handler(context, context.CancellationToken).ConfigureAwait(false); return null; } }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/CommandActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/CommandActivity.cs index 5099b24e5..71f4f2f45 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/CommandActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/CommandActivity.cs @@ -23,7 +23,7 @@ public static App OnCommand(this App app, Func, Task> Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is CommandActivity @@ -40,7 +40,7 @@ public static App OnCommand(this App app, Func, Cancel Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is CommandActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/CommandResultActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/CommandResultActivity.cs index 80e6c260c..6c61a525c 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/CommandResultActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/CommandResultActivity.cs @@ -23,7 +23,7 @@ public static App OnCommandResult(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is CommandResultActivity @@ -40,7 +40,7 @@ public static App OnCommandResult(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is CommandResultActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelCreatedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelCreatedActivity.cs index 06b30f8c3..a940dde1c 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelCreatedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelCreatedActivity.cs @@ -34,7 +34,7 @@ public static App OnChannelCreated(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnChannelCreated(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelDeletedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelDeletedActivity.cs index 16e0180ea..f238b52c4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelDeletedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelDeletedActivity.cs @@ -34,7 +34,7 @@ public static App OnChannelDeleted(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnChannelDeleted(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberAddedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberAddedActivity.cs index ffb6d6bd9..e80cfcc07 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberAddedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberAddedActivity.cs @@ -31,7 +31,7 @@ public static App OnChannelMemberAdded(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnChannelMemberAdded(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberRemovedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberRemovedActivity.cs index 70df3b6c1..bea4648c1 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberRemovedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelMemberRemovedActivity.cs @@ -31,7 +31,7 @@ public static App OnChannelMemberRemoved(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnChannelMemberRemoved(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRenamedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRenamedActivity.cs index 444645606..e3abe935b 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRenamedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRenamedActivity.cs @@ -34,7 +34,7 @@ public static App OnChannelRenamed(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnChannelRenamed(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRestoredActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRestoredActivity.cs index 9eacc7cdc..563a96b62 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRestoredActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelRestoredActivity.cs @@ -34,7 +34,7 @@ public static App OnChannelRestored(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnChannelRestored(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelSharedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelSharedActivity.cs index 1d151800e..5fe63cfd4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelSharedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelSharedActivity.cs @@ -31,7 +31,7 @@ public static App OnChannelShared(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnChannelShared(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelUnsharedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelUnsharedActivity.cs index 0c534d81c..82aa08d95 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelUnsharedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ChannelUnsharedActivity.cs @@ -31,7 +31,7 @@ public static App OnChannelUnShared(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnChannelUnShared(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationEndActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationEndActivity.cs index 45eee3cde..f39660080 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationEndActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationEndActivity.cs @@ -30,7 +30,7 @@ public static App OnConversationEnd(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is EndOfConversationActivity @@ -50,7 +50,7 @@ public static App OnConversationEnd(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is EndOfConversationActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationUpdateActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationUpdateActivity.cs index 1819d58fe..30afd9be1 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationUpdateActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/ConversationUpdateActivity.cs @@ -36,7 +36,7 @@ public static App OnConversationUpdate(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is ConversationUpdateActivity @@ -53,7 +53,7 @@ public static App OnConversationUpdate(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is ConversationUpdateActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersAddedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersAddedActivity.cs index 480fa56a3..2d69e41a2 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersAddedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersAddedActivity.cs @@ -34,7 +34,7 @@ public static App OnMembersAdded(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnMembersAdded(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersRemovedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersRemovedActivity.cs index f599348aa..6faaa9ba9 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersRemovedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/MembersRemovedActivity.cs @@ -34,7 +34,7 @@ public static App OnMembersRemoved(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnMembersRemoved(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamArchivedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamArchivedActivity.cs index c72d56551..4dcda34e9 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamArchivedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamArchivedActivity.cs @@ -34,7 +34,7 @@ public static App OnTeamArchived(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnTeamArchived(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamDeletedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamDeletedActivity.cs index 3f1e1d77b..dc6822318 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamDeletedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamDeletedActivity.cs @@ -36,7 +36,7 @@ public static App OnTeamDeleted(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -62,7 +62,7 @@ public static App OnTeamHardDeleted(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -87,7 +87,7 @@ public static App OnTeamDeleted(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => @@ -112,7 +112,7 @@ public static App OnTeamHardDeleted(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRenamedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRenamedActivity.cs index e5bd1e943..eadb4dd67 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRenamedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRenamedActivity.cs @@ -34,7 +34,7 @@ public static App OnTeamRenamed(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnTeamRenamed(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRestoredActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRestoredActivity.cs index dc39d907c..c1ed9ccf7 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRestoredActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamRestoredActivity.cs @@ -34,7 +34,7 @@ public static App OnTeamRestored(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnTeamRestored(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamUnArchivedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamUnArchivedActivity.cs index 500113e61..10669c9a1 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamUnArchivedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Conversations/TeamUnArchivedActivity.cs @@ -34,7 +34,7 @@ public static App OnTeamUnArchived(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -59,7 +59,7 @@ public static App OnTeamUnArchived(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/EventActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/EventActivity.cs index 3c41630e4..a64e1e21b 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/EventActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/EventActivity.cs @@ -34,7 +34,7 @@ public static App OnEvent(this App app, Func, Task> hand Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is EventActivity @@ -51,7 +51,7 @@ public static App OnEvent(this App app, Func, Cancellati Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is EventActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingEndActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingEndActivity.cs index 34fcc412f..303787ea4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingEndActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingEndActivity.cs @@ -36,7 +36,7 @@ public static App OnMeetingEnd(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingEndActivity @@ -53,7 +53,7 @@ public static App OnMeetingEnd(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingEndActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingJoinActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingJoinActivity.cs index a72a7e4bb..363effe5d 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingJoinActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingJoinActivity.cs @@ -36,7 +36,7 @@ public static App OnMeetingJoin(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingParticipantJoinActivity @@ -53,7 +53,7 @@ public static App OnMeetingJoin(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingParticipantJoinActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingLeaveActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingLeaveActivity.cs index 14ffe8c8b..661658f3a 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingLeaveActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingLeaveActivity.cs @@ -36,7 +36,7 @@ public static App OnMeetingLeave(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingParticipantLeaveActivity @@ -53,7 +53,7 @@ public static App OnMeetingLeave(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingParticipantLeaveActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingStartActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingStartActivity.cs index e5f30f340..aaad370d0 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingStartActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/MeetingStartActivity.cs @@ -36,7 +36,7 @@ public static App OnMeetingStart(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingStartActivity @@ -53,7 +53,7 @@ public static App OnMeetingStart(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MeetingStartActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Events/ReadReceiptActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Events/ReadReceiptActivity.cs index 255a85f65..68e0c3f62 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Events/ReadReceiptActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Events/ReadReceiptActivity.cs @@ -36,7 +36,7 @@ public static App OnReadReceipt(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is ReadReceiptActivity @@ -53,7 +53,7 @@ public static App OnReadReceipt(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is ReadReceiptActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallActivity.cs index 39234f491..690de22cb 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallActivity.cs @@ -31,7 +31,7 @@ public static App OnInstall(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnInstall(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallUpdateActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallUpdateActivity.cs index 791087c31..1d2afd0cd 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallUpdateActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Installs/InstallUpdateActivity.cs @@ -33,7 +33,7 @@ public static App OnInstallUpdate(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is InstallUpdateActivity @@ -50,7 +50,7 @@ public static App OnInstallUpdate(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is InstallUpdateActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Installs/UnInstallActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Installs/UnInstallActivity.cs index 663ba9173..65a246de4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Installs/UnInstallActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Installs/UnInstallActivity.cs @@ -31,7 +31,7 @@ public static App OnUnInstall(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -56,7 +56,7 @@ public static App OnUnInstall(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/AdaptiveCards/ActionActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/AdaptiveCards/ActionActivity.cs index a0580dd02..d9d6e805e 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/AdaptiveCards/ActionActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/AdaptiveCards/ActionActivity.cs @@ -28,7 +28,7 @@ public static App OnAdaptiveCardAction(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is AdaptiveCards.ActionActivity @@ -44,7 +44,7 @@ public static App OnAdaptiveCardAction(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is AdaptiveCards.ActionActivity }); @@ -58,7 +58,7 @@ public static App OnAdaptiveCardAction(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is AdaptiveCards.ActionActivity }); @@ -73,7 +73,7 @@ public static App OnAdaptiveCardAction(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is AdaptiveCards.ActionActivity @@ -88,7 +88,7 @@ public static App OnAdaptiveCardAction(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is AdaptiveCards.ActionActivity }); @@ -101,7 +101,7 @@ public static App OnAdaptiveCardAction(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is AdaptiveCards.ActionActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/FetchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/FetchActivity.cs index 07b725047..2deabfbca 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/FetchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/FetchActivity.cs @@ -28,7 +28,7 @@ public static App OnConfigFetch(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Configs.FetchActivity @@ -44,7 +44,7 @@ public static App OnConfigFetch(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Configs.FetchActivity }); @@ -58,7 +58,7 @@ public static App OnConfigFetch(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Configs.FetchActivity }); @@ -73,7 +73,7 @@ public static App OnConfigFetch(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Configs.FetchActivity @@ -88,7 +88,7 @@ public static App OnConfigFetch(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Configs.FetchActivity }); @@ -101,7 +101,7 @@ public static App OnConfigFetch(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Configs.FetchActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/SubmitActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/SubmitActivity.cs index 103e42af8..7c9554492 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/SubmitActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Configs/SubmitActivity.cs @@ -28,7 +28,7 @@ public static App OnConfigSubmit(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Configs.SubmitActivity @@ -44,7 +44,7 @@ public static App OnConfigSubmit(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Configs.SubmitActivity }); @@ -58,7 +58,7 @@ public static App OnConfigSubmit(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Configs.SubmitActivity }); @@ -73,7 +73,7 @@ public static App OnConfigSubmit(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Configs.SubmitActivity @@ -88,7 +88,7 @@ public static App OnConfigSubmit(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Configs.SubmitActivity }); @@ -101,7 +101,7 @@ public static App OnConfigSubmit(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Configs.SubmitActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/ExecuteActionActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/ExecuteActionActivity.cs index 68917f167..4694741a4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/ExecuteActionActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/ExecuteActionActivity.cs @@ -24,7 +24,7 @@ public static App OnExecuteAction(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is ExecuteActionActivity @@ -55,7 +55,7 @@ public static App OnExecuteAction(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is ExecuteActionActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/FileConsentActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/FileConsentActivity.cs index c08d809a9..bac18075a 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/FileConsentActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/FileConsentActivity.cs @@ -24,7 +24,7 @@ public static App OnFileConsent(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is FileConsentActivity @@ -55,7 +55,7 @@ public static App OnFileConsent(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is FileConsentActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/HandoffActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/HandoffActivity.cs index d15dc821a..4795604bf 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/HandoffActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/HandoffActivity.cs @@ -24,7 +24,7 @@ public static App OnHandoff(this App app, Func, Task> Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is HandoffActivity @@ -55,7 +55,7 @@ public static App OnHandoff(this App app, Func, Cancel Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is HandoffActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/InvokeActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/InvokeActivity.cs index 0ecc9ee76..1aa107cf6 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/InvokeActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/InvokeActivity.cs @@ -40,7 +40,7 @@ public static App OnInvoke(this App app, Func, Task> ha Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is InvokeActivity @@ -70,7 +70,7 @@ public static App OnInvoke(this App app, Func, Task await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is InvokeActivity }); @@ -85,7 +85,7 @@ public static App OnInvoke(this App app, Func, Cancella Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is InvokeActivity @@ -113,7 +113,7 @@ public static App OnInvoke(this App app, Func, Cancella { Name = ActivityType.Invoke, Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is InvokeActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/AnonQueryLinkActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/AnonQueryLinkActivity.cs index 2fb05245c..4c3ca81cd 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/AnonQueryLinkActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/AnonQueryLinkActivity.cs @@ -27,7 +27,7 @@ public static App OnAnonQueryLink(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity @@ -43,7 +43,7 @@ public static App OnAnonQueryLink(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity }); @@ -57,7 +57,7 @@ public static App OnAnonQueryLink(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity }); @@ -72,7 +72,7 @@ public static App OnAnonQueryLink(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity @@ -87,7 +87,7 @@ public static App OnAnonQueryLink(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity }); @@ -100,7 +100,7 @@ public static App OnAnonQueryLink(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.AnonQueryLinkActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/CardButtonClickedActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/CardButtonClickedActivity.cs index 1f14523e3..56a6bb2f7 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/CardButtonClickedActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/CardButtonClickedActivity.cs @@ -27,7 +27,7 @@ public static App OnCardButtonClicked(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.CardButtonClickedActivity @@ -44,7 +44,7 @@ public static App OnCardButtonClicked(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.CardButtonClickedActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/FetchTaskActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/FetchTaskActivity.cs index 1cf7c7657..0bb12965a 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/FetchTaskActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/FetchTaskActivity.cs @@ -27,7 +27,7 @@ public static App OnFetchTask(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.FetchTaskActivity @@ -43,7 +43,7 @@ public static App OnFetchTask(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.FetchTaskActivity }); @@ -57,7 +57,7 @@ public static App OnFetchTask(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.FetchTaskActivity }); @@ -72,7 +72,7 @@ public static App OnFetchTask(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.FetchTaskActivity @@ -87,7 +87,7 @@ public static App OnFetchTask(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.FetchTaskActivity }); @@ -100,7 +100,7 @@ public static App OnFetchTask(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.FetchTaskActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryActivity.cs index c8190fdff..2c8e014b4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryActivity.cs @@ -27,7 +27,7 @@ public static App OnQuery(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QueryActivity @@ -43,7 +43,7 @@ public static App OnQuery(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryActivity }); @@ -57,7 +57,7 @@ public static App OnQuery(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryActivity }); @@ -72,7 +72,7 @@ public static App OnQuery(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QueryActivity @@ -87,7 +87,7 @@ public static App OnQuery(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryActivity }); @@ -100,7 +100,7 @@ public static App OnQuery(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryLinkActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryLinkActivity.cs index e94854709..a7374a1e7 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryLinkActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QueryLinkActivity.cs @@ -27,7 +27,7 @@ public static App OnQueryLink(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QueryLinkActivity @@ -43,7 +43,7 @@ public static App OnQueryLink(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryLinkActivity }); @@ -57,7 +57,7 @@ public static App OnQueryLink(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryLinkActivity }); @@ -72,7 +72,7 @@ public static App OnQueryLink(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QueryLinkActivity @@ -87,7 +87,7 @@ public static App OnQueryLink(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryLinkActivity }); @@ -100,7 +100,7 @@ public static App OnQueryLink(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QueryLinkActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QuerySettingsUrlActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QuerySettingsUrlActivity.cs index 646d42c52..6d337cd53 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QuerySettingsUrlActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/QuerySettingsUrlActivity.cs @@ -27,7 +27,7 @@ public static App OnQuerySettingsUrl(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity @@ -43,7 +43,7 @@ public static App OnQuerySettingsUrl(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity }); @@ -57,7 +57,7 @@ public static App OnQuerySettingsUrl(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity }); @@ -72,7 +72,7 @@ public static App OnQuerySettingsUrl(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity @@ -87,7 +87,7 @@ public static App OnQuerySettingsUrl(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity }); @@ -100,7 +100,7 @@ public static App OnQuerySettingsUrl(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.QuerySettingUrlActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SelectItemActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SelectItemActivity.cs index 87af1ad26..8d68228f9 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SelectItemActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SelectItemActivity.cs @@ -27,7 +27,7 @@ public static App OnSelectItem(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SelectItemActivity @@ -43,7 +43,7 @@ public static App OnSelectItem(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SelectItemActivity }); @@ -57,7 +57,7 @@ public static App OnSelectItem(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SelectItemActivity }); @@ -72,7 +72,7 @@ public static App OnSelectItem(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SelectItemActivity @@ -87,7 +87,7 @@ public static App OnSelectItem(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SelectItemActivity }); @@ -100,7 +100,7 @@ public static App OnSelectItem(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SelectItemActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SettingsActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SettingsActivity.cs index 67bdc97a1..e0c4c6a6b 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SettingsActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SettingsActivity.cs @@ -27,7 +27,7 @@ public static App OnSetting(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SettingActivity @@ -44,7 +44,7 @@ public static App OnSetting(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SettingActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SubmitActionActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SubmitActionActivity.cs index 067830200..db588175a 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SubmitActionActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/MessageExtensions/SubmitActionActivity.cs @@ -27,7 +27,7 @@ public static App OnSubmitAction(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SubmitActionActivity @@ -43,7 +43,7 @@ public static App OnSubmitAction(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SubmitActionActivity }); @@ -57,7 +57,7 @@ public static App OnSubmitAction(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SubmitActionActivity }); @@ -72,7 +72,7 @@ public static App OnSubmitAction(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageExtensions.SubmitActionActivity @@ -87,7 +87,7 @@ public static App OnSubmitAction(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SubmitActionActivity }); @@ -100,7 +100,7 @@ public static App OnSubmitAction(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is MessageExtensions.SubmitActionActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/FeedbackActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/FeedbackActivity.cs index 96835a56e..b3cc05dc8 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/FeedbackActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/FeedbackActivity.cs @@ -38,7 +38,7 @@ public static App OnFeedback(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Messages.SubmitActionActivity submitAction && submitAction.Value?.ActionName == "feedback" @@ -58,7 +58,7 @@ public static App OnFeedback(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Messages.SubmitActionActivity submitAction && submitAction.Value?.ActionName == "feedback" diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/SubmitActionActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/SubmitActionActivity.cs index 6e911e1f6..1c5579917 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/SubmitActionActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Messages/SubmitActionActivity.cs @@ -27,7 +27,7 @@ public static App OnSubmitAction(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Messages.SubmitActionActivity @@ -58,7 +58,7 @@ public static App OnSubmitAction(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Messages.SubmitActionActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/AnswerSearchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/AnswerSearchActivity.cs index 9a2647ad5..5dbac2182 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/AnswerSearchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/AnswerSearchActivity.cs @@ -33,7 +33,7 @@ public static App OnAnswerSearch(this App app, Func, Ta Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -57,7 +57,7 @@ public static App OnAnswerSearch(this App app, Func, Ta { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.SearchAnswer]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -79,7 +79,7 @@ public static App OnAnswerSearch(this App app, Func, Ta { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.SearchAnswer]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -102,7 +102,7 @@ public static App OnAnswerSearch(this App app, Func, Ca Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => @@ -125,7 +125,7 @@ public static App OnAnswerSearch(this App app, Func, Ca { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.SearchAnswer]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -146,7 +146,7 @@ public static App OnAnswerSearch(this App app, Func, Ca { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.SearchAnswer]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/SearchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/SearchActivity.cs index 263f36708..70158a6b8 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/SearchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/SearchActivity.cs @@ -22,7 +22,7 @@ public static App OnSearch(this App app, Func, Task> ha Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is SearchActivity @@ -38,7 +38,7 @@ public static App OnSearch(this App app, Func, Task await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SearchActivity }); @@ -52,7 +52,7 @@ public static App OnSearch(this App app, Func, Task await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SearchActivity }); @@ -67,7 +67,7 @@ public static App OnSearch(this App app, Func, Cancella Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is SearchActivity @@ -82,7 +82,7 @@ public static App OnSearch(this App app, Func, Cancella { Name = string.Join("/", [ActivityType.Invoke, Name.Search]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SearchActivity }); @@ -95,7 +95,7 @@ public static App OnSearch(this App app, Func, Cancella { Name = string.Join("/", [ActivityType.Invoke, Name.Search]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SearchActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/TypeaheadSearchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/TypeaheadSearchActivity.cs index 3af409317..6222a5393 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/TypeaheadSearchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Search/TypeaheadSearchActivity.cs @@ -33,7 +33,7 @@ public static App OnTypeaheadSearch(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -57,7 +57,7 @@ public static App OnTypeaheadSearch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.Typeahead]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -79,7 +79,7 @@ public static App OnTypeaheadSearch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.Typeahead]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -102,7 +102,7 @@ public static App OnTypeaheadSearch(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => @@ -125,7 +125,7 @@ public static App OnTypeaheadSearch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.Typeahead]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) @@ -146,7 +146,7 @@ public static App OnTypeaheadSearch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Search, SearchType.Typeahead]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => { if (activity is SearchActivity search) diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/FailureActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/FailureActivity.cs index ffc2d42f7..ec41e8cea 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/FailureActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/FailureActivity.cs @@ -30,7 +30,7 @@ public static App OnSignInFailure(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.FailureActivity @@ -66,7 +66,7 @@ public static App OnSignInFailure(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SignIn.FailureActivity }); @@ -84,7 +84,7 @@ public static App OnSignInFailure(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.FailureActivity @@ -118,7 +118,7 @@ public static App OnSignInFailure(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SignIn.FailureActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/TokenExchangeActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/TokenExchangeActivity.cs index c4c5b9f1c..9c77a5c06 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/TokenExchangeActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/TokenExchangeActivity.cs @@ -24,7 +24,7 @@ public static App OnTokenExchange(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.TokenExchangeActivity @@ -40,7 +40,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); @@ -54,7 +54,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); @@ -68,7 +68,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); @@ -83,7 +83,7 @@ public static App OnTokenExchange(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.TokenExchangeActivity @@ -98,7 +98,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); @@ -111,7 +111,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); @@ -124,7 +124,7 @@ public static App OnTokenExchange(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SignIn.TokenExchangeActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/VerifyStateAcitivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/VerifyStateAcitivity.cs index 961fefd8f..79d30dffd 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/VerifyStateAcitivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/SignIn/VerifyStateAcitivity.cs @@ -24,7 +24,7 @@ public static App OnVerifyState(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.VerifyStateActivity @@ -54,7 +54,7 @@ public static App OnVerifyState(this App app, Func await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is SignIn.VerifyStateActivity }); @@ -69,7 +69,7 @@ public static App OnVerifyState(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is SignIn.VerifyStateActivity @@ -97,7 +97,7 @@ public static App OnVerifyState(this App app, Func await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is SignIn.VerifyStateActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/FetchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/FetchActivity.cs index 25e9344c7..58205aead 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/FetchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/FetchActivity.cs @@ -27,7 +27,7 @@ public static App OnTabFetch(this App app, Func, Ta Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Tabs.FetchActivity @@ -43,7 +43,7 @@ public static App OnTabFetch(this App app, Func, Ta { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tabs.FetchActivity }); @@ -57,7 +57,7 @@ public static App OnTabFetch(this App app, Func, Ta { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tabs.FetchActivity }); @@ -72,7 +72,7 @@ public static App OnTabFetch(this App app, Func, Ca Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Tabs.FetchActivity @@ -87,7 +87,7 @@ public static App OnTabFetch(this App app, Func, Ca { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tabs.FetchActivity }); @@ -100,7 +100,7 @@ public static App OnTabFetch(this App app, Func, Ca { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tabs.FetchActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/SubmitActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/SubmitActivity.cs index 0b96b1cfb..c10c614b4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/SubmitActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tabs/SubmitActivity.cs @@ -27,7 +27,7 @@ public static App OnTabSubmit(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Tabs.SubmitActivity @@ -43,7 +43,7 @@ public static App OnTabSubmit(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tabs.SubmitActivity }); @@ -57,7 +57,7 @@ public static App OnTabSubmit(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tabs.SubmitActivity }); @@ -72,7 +72,7 @@ public static App OnTabSubmit(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Tabs.SubmitActivity @@ -87,7 +87,7 @@ public static App OnTabSubmit(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tabs.SubmitActivity }); @@ -100,7 +100,7 @@ public static App OnTabSubmit(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tabs.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tabs.SubmitActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/FetchActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/FetchActivity.cs index 3aa618c56..614bbdb4b 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/FetchActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/FetchActivity.cs @@ -24,7 +24,7 @@ public static App OnTaskFetch(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Tasks.FetchActivity @@ -40,7 +40,7 @@ public static App OnTaskFetch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tasks.FetchActivity }); @@ -54,7 +54,7 @@ public static App OnTaskFetch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tasks.FetchActivity }); @@ -69,7 +69,7 @@ public static App OnTaskFetch(this App app, Func, Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Tasks.FetchActivity @@ -84,7 +84,7 @@ public static App OnTaskFetch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tasks.FetchActivity }); @@ -97,7 +97,7 @@ public static App OnTaskFetch(this App app, Func, { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Fetch]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tasks.FetchActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/SubmitActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/SubmitActivity.cs index 8c0ee347d..71c15335c 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/SubmitActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Invokes/Tasks/SubmitActivity.cs @@ -24,7 +24,7 @@ public static App OnTaskSubmit(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is Tasks.SubmitActivity @@ -40,7 +40,7 @@ public static App OnTaskSubmit(this App app, Func { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tasks.SubmitActivity }); @@ -54,7 +54,7 @@ public static App OnTaskSubmit(this App app, Func { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType()), + Handler = async context => await handler(context.ToActivityType()).ConfigureAwait(false), Selector = activity => activity is Tasks.SubmitActivity }); @@ -69,7 +69,7 @@ public static App OnTaskSubmit(this App app, Func Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is Tasks.SubmitActivity @@ -84,7 +84,7 @@ public static App OnTaskSubmit(this App app, Func { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tasks.SubmitActivity }); @@ -97,7 +97,7 @@ public static App OnTaskSubmit(this App app, Func { Name = string.Join("/", [ActivityType.Invoke, Name.Tasks.Submit]), Type = app.Status is null ? RouteType.System : RouteType.User, - Handler = async context => await handler(context.ToActivityType(), context.CancellationToken), + Handler = async context => await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false), Selector = activity => activity is Tasks.SubmitActivity }); diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageActivity.cs index d469f8b59..400edb7d8 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageActivity.cs @@ -45,7 +45,7 @@ public static App OnMessage(this App app, Func, Task> Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageActivity @@ -62,7 +62,7 @@ public static App OnMessage(this App app, Func, Cancel Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageActivity @@ -80,7 +80,7 @@ public static App OnMessage(this App app, string pattern, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -106,7 +106,7 @@ public static App OnMessage(this App app, string pattern, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => @@ -132,7 +132,7 @@ public static App OnMessage(this App app, Regex regex, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -157,7 +157,7 @@ public static App OnMessage(this App app, Regex regex, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageDeleteActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageDeleteActivity.cs index ff15acb1c..e0aff7741 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageDeleteActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageDeleteActivity.cs @@ -26,7 +26,7 @@ public static App OnMessageDelete(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageDeleteActivity @@ -43,7 +43,7 @@ public static App OnMessageDelete(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageDeleteActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageReactionActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageReactionActivity.cs index 6d2f018ac..94f195960 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageReactionActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageReactionActivity.cs @@ -54,7 +54,7 @@ public static App OnMessageReaction(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageReactionActivity @@ -71,7 +71,7 @@ public static App OnMessageReaction(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageReactionActivity @@ -89,7 +89,7 @@ public static App OnMessageReactionAdded(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -114,7 +114,7 @@ public static App OnMessageReactionAdded(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => @@ -140,7 +140,7 @@ public static App OnMessageReactionRemoved(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => @@ -165,7 +165,7 @@ public static App OnMessageReactionRemoved(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => diff --git a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageUpdateActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageUpdateActivity.cs index b3028f20f..75ba16c0b 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageUpdateActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/Messages/MessageUpdateActivity.cs @@ -26,7 +26,7 @@ public static App OnMessageUpdate(this App app, Func { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageUpdateActivity @@ -43,7 +43,7 @@ public static App OnMessageUpdate(this App app, Func { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is MessageUpdateActivity diff --git a/Libraries/Microsoft.Teams.Apps/Activities/TypingActivity.cs b/Libraries/Microsoft.Teams.Apps/Activities/TypingActivity.cs index 9a7d5b465..f846e4cb4 100644 --- a/Libraries/Microsoft.Teams.Apps/Activities/TypingActivity.cs +++ b/Libraries/Microsoft.Teams.Apps/Activities/TypingActivity.cs @@ -23,7 +23,7 @@ public static App OnTyping(this App app, Func, Task> ha Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType()); + await handler(context.ToActivityType()).ConfigureAwait(false); return null; }, Selector = activity => activity is TypingActivity @@ -40,7 +40,7 @@ public static App OnTyping(this App app, Func, Cancella Type = app.Status is null ? RouteType.System : RouteType.User, Handler = async context => { - await handler(context.ToActivityType(), context.CancellationToken); + await handler(context.ToActivityType(), context.CancellationToken).ConfigureAwait(false); return null; }, Selector = activity => activity is TypingActivity diff --git a/Libraries/Microsoft.Teams.Apps/App.cs b/Libraries/Microsoft.Teams.Apps/App.cs index 26560d260..eb054e57f 100644 --- a/Libraries/Microsoft.Teams.Apps/App.cs +++ b/Libraries/Microsoft.Teams.Apps/App.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Teams.Api; @@ -146,7 +146,7 @@ public async Task Start(CancellationToken cancellationToken = default) { try { - var res = await Api.Bots.Token.GetAsync(Credentials, TokenClient); + var res = await Api.Bots.Token.GetAsync(Credentials, TokenClient).ConfigureAwait(false); Token = new JsonWebToken(res.AccessToken); } catch (Exception ex) @@ -160,12 +160,12 @@ public async Task Start(CancellationToken cancellationToken = default) foreach (var plugin in Plugins) { - await plugin.OnInit(this, cancellationToken); + await plugin.OnInit(this, cancellationToken).ConfigureAwait(false); } foreach (var plugin in Plugins) { - await plugin.OnStart(this, cancellationToken); + await plugin.OnStart(this, cancellationToken).ConfigureAwait(false); } Status = Apps.Status.Started; @@ -177,7 +177,7 @@ await Events.Emit( null!, EventType.Error, new ErrorEvent() { Exception = ex } - ); + ).ConfigureAwait(false); } } @@ -218,14 +218,14 @@ public async Task Send(string conversationId, T activity, ConversationType throw new Exception("no plugin that can send activities was found"); } - var res = await sender.Send(activity, reference, cancellationToken); + var res = await sender.Send(activity, reference, cancellationToken).ConfigureAwait(false); await Events.Emit( sender, EventType.ActivitySent, new ActivitySentEvent() { Activity = res }, cancellationToken - ); + ).ConfigureAwait(false); return res; } @@ -236,7 +236,7 @@ await Events.Emit( /// the text to send public async Task Send(string conversationId, string text, ConversationType? conversationType = null, string? serviceUrl = null, CancellationToken cancellationToken = default) { - return await Send(conversationId, new MessageActivity(text), conversationType, serviceUrl, cancellationToken); + return await Send(conversationId, new MessageActivity(text), conversationType, serviceUrl, cancellationToken).ConfigureAwait(false); } /// @@ -245,7 +245,7 @@ public async Task Send(string conversationId, string text, Conv /// the card to send as an attachment public async Task Send(string conversationId, Cards.AdaptiveCard card, ConversationType? conversationType = null, string? serviceUrl = null, CancellationToken cancellationToken = default) { - return await Send(conversationId, new MessageActivity().AddAttachment(card), conversationType, serviceUrl, cancellationToken); + return await Send(conversationId, new MessageActivity().AddAttachment(card), conversationType, serviceUrl, cancellationToken).ConfigureAwait(false); } /// @@ -323,7 +323,7 @@ public async Task Process(ISenderPlugin sender, IToken token, IActivit Token = token, Activity = activity, Extra = extra - }, cancellationToken); + }, cancellationToken).ConfigureAwait(false); } /// @@ -376,10 +376,14 @@ private async Task Process(ISenderPlugin sender, ActivityEvent @event, UserId = @event.Activity.From.Id, ChannelId = @event.Activity.ChannelId, ConnectionName = OAuth.DefaultConnectionName - }); + }, cancellationToken).ConfigureAwait(false); userToken = new JsonWebToken(tokenResponse); } + catch (OperationCanceledException) + { + throw; + } catch { } } @@ -405,7 +409,7 @@ private async Task Process(ISenderPlugin sender, ActivityEvent @event, if (i + 1 == routes.Count) return data; i++; - var res = await routes[i].Invoke(context); + var res = await routes[i].Invoke(context).ConfigureAwait(false); if (res is not null) data = res; @@ -436,7 +440,7 @@ await Events.Emit( EventType.ActivitySent, new ActivitySentEvent() { Activity = activity }, context.CancellationToken - ); + ).ConfigureAwait(false); } }; @@ -447,7 +451,7 @@ await Events.Emit( EventType.ActivitySent, new ActivitySentEvent() { Activity = activity }, cancellationToken - ); + ).ConfigureAwait(false); }; if (@event.Services is not null) @@ -462,11 +466,11 @@ await Events.Emit( foreach (var plugin in Plugins) { - await plugin.OnActivity(this, sender, @event, cancellationToken); + await plugin.OnActivity(this, sender, @event, cancellationToken).ConfigureAwait(false); } - var res = await Next(context); - await stream.Close(cancellationToken); + var res = await Next(context).ConfigureAwait(false); + await stream.Close(cancellationToken).ConfigureAwait(false); var response = res is Response value ? value @@ -480,8 +484,8 @@ await Events.Emit( EventType.ActivityResponse, new ActivityResponseEvent() { Response = response }, cancellationToken - ); + ).ConfigureAwait(false); return response; } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Apps/AppEvents.cs b/Libraries/Microsoft.Teams.Apps/AppEvents.cs index 8868ed5a0..b7cc0269d 100644 --- a/Libraries/Microsoft.Teams.Apps/AppEvents.cs +++ b/Libraries/Microsoft.Teams.Apps/AppEvents.cs @@ -22,14 +22,14 @@ protected async Task OnErrorEvent(IPlugin sender, ErrorEvent @event, Cancellatio if (ex.Request?.Content is not null) { - var content = await ex.Request.Content.ReadAsStringAsync(); + var content = await ex.Request.Content.ReadAsStringAsync().ConfigureAwait(false); Logger.Error(content); } } foreach (var plugin in Plugins.Where(p => !ReferenceEquals(sender, p))) { - await plugin.OnError(this, sender, @event, cancellationToken); + await plugin.OnError(this, sender, @event, cancellationToken).ConfigureAwait(false); } } @@ -45,7 +45,7 @@ protected async Task OnActivitySentEvent(ISenderPlugin sender, ActivitySentEvent foreach (var plugin in Plugins.Where(p => !ReferenceEquals(sender, p))) { - await plugin.OnActivitySent(this, sender, @event, cancellationToken); + await plugin.OnActivitySent(this, sender, @event, cancellationToken).ConfigureAwait(false); } } @@ -55,7 +55,7 @@ protected async Task OnActivityResponseEvent(ISenderPlugin sender, ActivityRespo foreach (var plugin in Plugins.Where(p => !ReferenceEquals(sender, p))) { - await plugin.OnActivityResponse(this, sender, @event, cancellationToken); + await plugin.OnActivityResponse(this, sender, @event, cancellationToken).ConfigureAwait(false); } } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Apps/AppPlugins.cs b/Libraries/Microsoft.Teams.Apps/AppPlugins.cs index ec1c63b6b..2d1a023b2 100644 --- a/Libraries/Microsoft.Teams.Apps/AppPlugins.cs +++ b/Libraries/Microsoft.Teams.Apps/AppPlugins.cs @@ -37,11 +37,11 @@ public App AddPlugin(IPlugin plugin) { var eventType = new EventType(name); - await Events.Emit(plugin, $"{attr.Name}.{name}", @event, token); + await Events.Emit(plugin, $"{attr.Name}.{name}", @event, token).ConfigureAwait(false); if (eventType.IsBuiltIn && !eventType.IsStart) { - return await Events.Emit(plugin, name, @event, token); + return await Events.Emit(plugin, name, @event, token).ConfigureAwait(false); } return null; diff --git a/Libraries/Microsoft.Teams.Apps/AppRouting.cs b/Libraries/Microsoft.Teams.Apps/AppRouting.cs index 511cb84cc..4d062ab7d 100644 --- a/Libraries/Microsoft.Teams.Apps/AppRouting.cs +++ b/Libraries/Microsoft.Teams.Apps/AppRouting.cs @@ -55,7 +55,7 @@ public App AddController(T controller) where T : class { this.OnEvent(attr.Name, async (plugin, @event, token) => { - await method.InvokeAsync(controller, [plugin, @event]); + await method.InvokeAsync(controller, [plugin, @event]).ConfigureAwait(false); }); Logger.Debug($"'{attr.Name}' event route '{name}.{method.Name}' registered"); @@ -83,7 +83,7 @@ protected async Task OnTokenExchangeActivity(IContext(), Token = res - }, cancellationToken - ); + }, + cancellationToken + ).ConfigureAwait(false); return new Response(HttpStatusCode.OK); } @@ -110,7 +111,7 @@ await Events.Emit( Context = context.ToActivityType() }, cancellationToken - ); + ).ConfigureAwait(false); if (ex.StatusCode != HttpStatusCode.NotFound && ex.StatusCode != HttpStatusCode.BadRequest && ex.StatusCode != HttpStatusCode.PreconditionFailed) { @@ -142,7 +143,7 @@ await Events.Emit( UserId = context.Activity.From.Id, ConnectionName = OAuth.DefaultConnectionName, Code = context.Activity.Value.State - }, cancellationToken); + }, cancellationToken).ConfigureAwait(false); context.UserGraphToken = new JsonWebToken(res); @@ -155,7 +156,7 @@ await Events.Emit( Token = res }, cancellationToken - ); + ).ConfigureAwait(false); return new Response(HttpStatusCode.OK); } catch (HttpException ex) @@ -169,7 +170,7 @@ await Events.Emit( Context = context.ToActivityType() }, context.CancellationToken - ); + ).ConfigureAwait(false); if (ex.StatusCode != HttpStatusCode.NotFound && ex.StatusCode != HttpStatusCode.BadRequest && ex.StatusCode != HttpStatusCode.PreconditionFailed) { @@ -220,7 +221,7 @@ await Events.Emit( Context = context.ToActivityType() }, cancellationToken - ); + ).ConfigureAwait(false); return new Response(HttpStatusCode.OK); } @@ -251,8 +252,8 @@ public App Use(Func, Task> handler) { return Use(async (context) => { - await handler(context); + await handler(context).ConfigureAwait(false); return null; }); } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Apps/Contexts/Client/FunctionContext.cs b/Libraries/Microsoft.Teams.Apps/Contexts/Client/FunctionContext.cs index 2f232ff98..26682f56a 100644 --- a/Libraries/Microsoft.Teams.Apps/Contexts/Client/FunctionContext.cs +++ b/Libraries/Microsoft.Teams.Apps/Contexts/Client/FunctionContext.cs @@ -81,12 +81,12 @@ public async Task Send(TActivity activity, CancellationTok Name = UserName, } ] - }); + }).ConfigureAwait(false); conversationId = res.Id; } - return await app.Send(conversationId, activity, cancellationToken: cancellationToken); + return await app.Send(conversationId, activity, cancellationToken: cancellationToken).ConfigureAwait(false); } public Task Send(string text, CancellationToken cancellationToken = default) diff --git a/Libraries/Microsoft.Teams.Apps/Contexts/Context.Send.cs b/Libraries/Microsoft.Teams.Apps/Contexts/Context.Send.cs index 4bdd4deb0..6022ff25a 100644 --- a/Libraries/Microsoft.Teams.Apps/Contexts/Context.Send.cs +++ b/Libraries/Microsoft.Teams.Apps/Contexts/Context.Send.cs @@ -98,7 +98,7 @@ public async Task Send(T activity, CancellationToken cancellationToken = d } #pragma warning restore ExperimentalTeamsTargeted - var res = await Sender.Send(activity, Ref, CancellationToken); + var res = await Sender.Send(activity, Ref, cancellationToken); await OnActivitySent(res, ToActivityType()); return res; } diff --git a/Libraries/Microsoft.Teams.Apps/Contexts/Context.SignIn.cs b/Libraries/Microsoft.Teams.Apps/Contexts/Context.SignIn.cs index 004bc11df..59fc09e0b 100644 --- a/Libraries/Microsoft.Teams.Apps/Contexts/Context.SignIn.cs +++ b/Libraries/Microsoft.Teams.Apps/Contexts/Context.SignIn.cs @@ -64,11 +64,14 @@ public partial class Context : IContext UserId = Activity.From.Id, ChannelId = Activity.ChannelId, ConnectionName = options.ConnectionName ?? ConnectionName, - }); + }).ConfigureAwait(false); return tokenResponse.Token; } - catch { } + catch (Exception ex) + { + Log.Debug("Existing token retrieval failed, proceeding to token exchange", ex); + } var tokenExchangeState = new Api.TokenExchange.State() { @@ -85,17 +88,17 @@ public partial class Context : IContext { TenantId = Ref.Conversation.TenantId, Members = [Activity.From] - }); + }).ConfigureAwait(false); reference.Conversation.Id = id; reference.Conversation.IsGroup = false; - var oauthCardActivity = await Sender.Send(new MessageActivity(options.OAuthCardText), reference, token); - await OnActivitySent(oauthCardActivity, ToActivityType()); + var oauthCardActivity = await Sender.Send(new MessageActivity(options.OAuthCardText), reference, token).ConfigureAwait(false); + await OnActivitySent(oauthCardActivity, ToActivityType()).ConfigureAwait(false); } var state = Convert.ToBase64String(JsonSerializer.SerializeToUtf8Bytes(tokenExchangeState)); - var resource = await api.Bots.SignIn.GetResourceAsync(new() { State = state }); + var resource = await api.Bots.SignIn.GetResourceAsync(new() { State = state }).ConfigureAwait(false); var activity = new MessageActivity(); activity.Recipient = Activity.From; @@ -115,8 +118,8 @@ public partial class Context : IContext ] }); - var res = await Sender.Send(activity, reference, token); - await OnActivitySent(res, ToActivityType()); + var res = await Sender.Send(activity, reference, token).ConfigureAwait(false); + await OnActivitySent(res, ToActivityType()).ConfigureAwait(false); return null; } @@ -134,13 +137,13 @@ public async Task SignIn(SSOOptions options, CancellationToken cancellationToken { TenantId = Ref.Conversation.TenantId, Members = [Activity.From] - }); + }).ConfigureAwait(false); reference.Conversation.Id = id; reference.Conversation.IsGroup = false; - var oauthCardActivity = await Sender.Send(new MessageActivity(options.OAuthCardText), reference, token); - await OnActivitySent(oauthCardActivity, ToActivityType()); + var oauthCardActivity = await Sender.Send(new MessageActivity(options.OAuthCardText), reference, token).ConfigureAwait(false); + await OnActivitySent(oauthCardActivity, ToActivityType()).ConfigureAwait(false); } var activity = new MessageActivity(); @@ -163,8 +166,8 @@ public async Task SignIn(SSOOptions options, CancellationToken cancellationToken ] }); - var res = await Sender.Send(activity, reference, token); - await OnActivitySent(res, ToActivityType()); + var res = await Sender.Send(activity, reference, token).ConfigureAwait(false); + await OnActivitySent(res, ToActivityType()).ConfigureAwait(false); } public async Task SignOut(string? connectionName = null, CancellationToken cancellationToken = default) @@ -176,7 +179,7 @@ await api.Users.Token.SignOutAsync(new() ChannelId = Ref.ChannelId, UserId = Activity.From.Id, ConnectionName = connectionName ?? ConnectionName, - }); + }).ConfigureAwait(false); } } diff --git a/Libraries/Microsoft.Teams.Apps/Contexts/Context.cs b/Libraries/Microsoft.Teams.Apps/Contexts/Context.cs index 74baa25d1..09810fcfe 100644 --- a/Libraries/Microsoft.Teams.Apps/Contexts/Context.cs +++ b/Libraries/Microsoft.Teams.Apps/Contexts/Context.cs @@ -140,7 +140,7 @@ public partial class Context(ISenderPlugin sender, IStreamer stream) public CancellationToken CancellationToken { get; set; } internal Func, Task> OnNext { get; set; } = (_) => Task.FromResult(null); - internal ActivitySentHandler OnActivitySent { get; set; } = (_, _) => Task.Run(() => { }); + internal ActivitySentHandler OnActivitySent { get; set; } = (_, _) => Task.CompletedTask; public void Deconstruct(out ILogger log, out ApiClient api, out TActivity activity) { diff --git a/Libraries/Microsoft.Teams.Apps/Events/EventEmitter.cs b/Libraries/Microsoft.Teams.Apps/Events/EventEmitter.cs index 158a5dee1..d2eca5da4 100644 --- a/Libraries/Microsoft.Teams.Apps/Events/EventEmitter.cs +++ b/Libraries/Microsoft.Teams.Apps/Events/EventEmitter.cs @@ -50,7 +50,7 @@ public EventEmitter On(string name, Func { - await handler(plugin, @event, cancellationToken); + await handler(plugin, @event, cancellationToken).ConfigureAwait(false); return null; }); @@ -66,7 +66,7 @@ public EventEmitter On(string name, Func { - var res = await handler(plugin, @event, cancellationToken); + var res = await handler(plugin, @event, cancellationToken).ConfigureAwait(false); return res; }); @@ -80,6 +80,6 @@ public EventEmitter On(string name, Func, Task> Handler { get; set; } public bool Select(IActivity activity) => Selector(activity); - public async Task Invoke(IContext context) => await Handler(context); + public async Task Invoke(IContext context) => await Handler(context).ConfigureAwait(false); } public class AttributeRoute : IRoute diff --git a/Libraries/Microsoft.Teams.Common/Extensions/ActionExtensions.cs b/Libraries/Microsoft.Teams.Common/Extensions/ActionExtensions.cs index f622b3517..b4ca14cbd 100644 --- a/Libraries/Microsoft.Teams.Common/Extensions/ActionExtensions.cs +++ b/Libraries/Microsoft.Teams.Common/Extensions/ActionExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. namespace Microsoft.Teams.Common.Extensions; @@ -12,14 +12,23 @@ public static Action Debounce(this Action func, int milliseconds = 300) return arg => { cancelTokenSource?.Cancel(); + cancelTokenSource?.Dispose(); cancelTokenSource = new CancellationTokenSource(); - Task.Delay(milliseconds, cancelTokenSource.Token) + _ = Task.Delay(milliseconds, cancelTokenSource.Token) .ContinueWith(t => { - if (t.IsCompleted && !t.IsFaulted) + if (t.IsCompletedSuccessfully) { - func(arg); + try + { + func(arg); + } + catch + { + // Observe exception to prevent UnobservedTaskException. + // Callers use fire-and-forget; there is no upstream to propagate to. + } } }, TaskScheduler.Default); }; @@ -32,16 +41,28 @@ public static Action Debounce(this Func func, int milliseconds = 300) return () => { cancelTokenSource?.Cancel(); + cancelTokenSource?.Dispose(); cancelTokenSource = new CancellationTokenSource(); - Task.Delay(milliseconds, cancelTokenSource.Token) - .ContinueWith(async t => - { - if (t.IsCompleted && !t.IsFaulted) - { - await func(); - } - }, TaskScheduler.Default); + _ = DebounceCore(func, milliseconds, cancelTokenSource.Token); }; + + static async Task DebounceCore(Func func, int milliseconds, CancellationToken token) + { + try + { + await Task.Delay(milliseconds, token).ConfigureAwait(false); + await func().ConfigureAwait(false); + } + catch (OperationCanceledException) + { + // Debounce was cancelled by a newer invocation + } + catch (Exception) + { + // Observe exception to prevent UnobservedTaskException. + // Callers use fire-and-forget; there is no upstream to propagate to. + } + } } -} \ No newline at end of file +} diff --git a/Libraries/Microsoft.Teams.Common/Extensions/MethodInfoExtensions.cs b/Libraries/Microsoft.Teams.Common/Extensions/MethodInfoExtensions.cs index 3944a888a..bec1ffa12 100644 --- a/Libraries/Microsoft.Teams.Common/Extensions/MethodInfoExtensions.cs +++ b/Libraries/Microsoft.Teams.Common/Extensions/MethodInfoExtensions.cs @@ -20,7 +20,12 @@ public static class MethodInfoExtensions if (res is Task task) { await task.ConfigureAwait(false); - return task.GetType().GetProperty("Result")?.GetValue(task); + var resultProperty = task.GetType().GetProperty("Result"); + if (resultProperty is not null && task.GetType().IsGenericType) + { + return resultProperty.GetValue(task); + } + return null; } return res; diff --git a/Libraries/Microsoft.Teams.Common/Extensions/TaskExtensions.cs b/Libraries/Microsoft.Teams.Common/Extensions/TaskExtensions.cs index 1ce1db456..ebbbeccec 100644 --- a/Libraries/Microsoft.Teams.Common/Extensions/TaskExtensions.cs +++ b/Libraries/Microsoft.Teams.Common/Extensions/TaskExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. namespace Microsoft.Teams.Common.Extensions; @@ -20,7 +20,7 @@ public static async Task Retry(Func> taskFactory, int max = 3, int { if (max > 0) { - await Task.Delay(delay); + await Task.Delay(delay).ConfigureAwait(false); return await Retry(taskFactory, max - 1, delay * 2).ConfigureAwait(false); } throw new Exception(ex.Message, ex); diff --git a/Libraries/Microsoft.Teams.Common/Http/HttpClient.cs b/Libraries/Microsoft.Teams.Common/Http/HttpClient.cs index f2681f471..f15adc0c0 100644 --- a/Libraries/Microsoft.Teams.Common/Http/HttpClient.cs +++ b/Libraries/Microsoft.Teams.Common/Http/HttpClient.cs @@ -57,15 +57,15 @@ public HttpClient(System.Net.Http.HttpClient client) public async Task> SendAsync(IHttpRequest request, CancellationToken cancellationToken = default) { var httpRequest = CreateRequest(request); - var httpResponse = await _client.SendAsync(httpRequest); - return await CreateResponse(httpResponse, cancellationToken); + var httpResponse = await _client.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); + return await CreateResponse(httpResponse, cancellationToken).ConfigureAwait(false); } public async Task> SendAsync(IHttpRequest request, CancellationToken cancellationToken = default) { var httpRequest = CreateRequest(request); - var httpResponse = await _client.SendAsync(httpRequest, cancellationToken); - return await CreateResponse(httpResponse, cancellationToken); + var httpResponse = await _client.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); + return await CreateResponse(httpResponse, cancellationToken).ConfigureAwait(false); } public void Dispose() @@ -122,7 +122,7 @@ protected async Task> CreateResponse(HttpResponseMessage r { if (!response.IsSuccessStatusCode) { - var errorBody = await ParseErrorBody(response); + var errorBody = await ParseErrorBody(response, cancellationToken).ConfigureAwait(false); throw new HttpException() { @@ -133,7 +133,7 @@ protected async Task> CreateResponse(HttpResponseMessage r }; } - var body = await response.Content.ReadAsStringAsync() ?? throw new ArgumentNullException(); + var body = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false) ?? throw new ArgumentNullException(); return new HttpResponse() { @@ -147,7 +147,7 @@ protected async Task> CreateResponse { if (!response.IsSuccessStatusCode) { - var errorBody = await ParseErrorBody(response); + var errorBody = await ParseErrorBody(response, cancellationToken).ConfigureAwait(false); throw new HttpException() { @@ -158,7 +158,7 @@ protected async Task> CreateResponse }; } - var body = await response.Content.ReadFromJsonAsync(cancellationToken) ?? throw new ArgumentNullException(); + var body = await response.Content.ReadFromJsonAsync(cancellationToken).ConfigureAwait(false) ?? throw new ArgumentNullException(); return new HttpResponse() { @@ -168,9 +168,9 @@ protected async Task> CreateResponse }; } - private async Task ParseErrorBody(HttpResponseMessage response) + private async Task ParseErrorBody(HttpResponseMessage response, CancellationToken cancellationToken = default) { - var content = await response.Content.ReadAsStringAsync() ?? throw new ArgumentNullException(); + var content = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false) ?? throw new ArgumentNullException(); object errorBody = content; try diff --git a/Libraries/Microsoft.Teams.Common/Storage/LocalStorage.cs b/Libraries/Microsoft.Teams.Common/Storage/LocalStorage.cs index 2942b8aeb..e2c303fa5 100644 --- a/Libraries/Microsoft.Teams.Common/Storage/LocalStorage.cs +++ b/Libraries/Microsoft.Teams.Common/Storage/LocalStorage.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. namespace Microsoft.Teams.Common.Storage; @@ -57,7 +57,7 @@ public LocalStorage(IDictionary data, int? max) public async Task GetAsync(string key) where T : TValue { - var value = await GetAsync(key); + var value = await GetAsync(key).ConfigureAwait(false); return (T?)value; } @@ -79,7 +79,8 @@ public void Set(string key, TValue value) public Task SetAsync(string key, TValue value) { - return Task.Run(() => Set(key, value)); + Set(key, value); + return Task.CompletedTask; } public void Delete(string key) @@ -94,7 +95,8 @@ public void Delete(string key) public Task DeleteAsync(string key) { - return Task.Run(() => Delete(key)); + Delete(key); + return Task.CompletedTask; } protected bool Hit(string key) diff --git a/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/ServiceCollection.cs b/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/ServiceCollection.cs index 14c276f27..12fbd6b9d 100644 --- a/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/ServiceCollection.cs +++ b/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/ServiceCollection.cs @@ -99,6 +99,7 @@ public static IServiceCollection AddTeams(this IServiceCollection collection, Fu collection.AddSingleton(provider => provider.GetRequiredService()); collection.AddSingleton(); collection.AddHostedService(); + // DI factory delegates must be synchronous; this blocks the calling thread during service resolution. collection.AddSingleton(provider => factory(provider).GetAwaiter().GetResult()); collection.AddSingleton(provider => provider.GetRequiredService().Logger); collection.AddSingleton(provider => provider.GetRequiredService().Storage); diff --git a/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/TeamsService.cs b/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/TeamsService.cs index d4ed539a7..39d794da6 100644 --- a/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/TeamsService.cs +++ b/Libraries/Microsoft.Teams.Extensions/Microsoft.Teams.Extensions.Hosting/Microsoft.Teams.Apps.Extensions/TeamsService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Extensions.Hosting; @@ -31,7 +31,7 @@ public Task StartAsync(CancellationToken cancellationToken) public async Task StartedAsync(CancellationToken cancellationToken) { - await _app.Start(cancellationToken); + await _app.Start(cancellationToken).ConfigureAwait(false); _logger.LogDebug("Started"); } diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.BotBuilder/Controllers/MessageController.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.BotBuilder/Controllers/MessageController.cs index aa1694d16..0168296ea 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.BotBuilder/Controllers/MessageController.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.BotBuilder/Controllers/MessageController.cs @@ -36,7 +36,7 @@ public async Task PostAsync() // Delegate the processing of the HTTP POST to the adapter. // The adapter will invoke the bot. - await _adapter.ProcessAsync(HttpContext.Request, HttpContext.Response, _bot); + await _adapter.ProcessAsync(HttpContext.Request, HttpContext.Response, _bot).ConfigureAwait(false); if (Response.HasStarted) { @@ -44,7 +44,7 @@ public async Task PostAsync() } // Fallback logic use the plugin to process the activity - return await _plugin.Do(HttpContext, _lifetime.ApplicationStopping); + return await _plugin.Do(HttpContext, _lifetime.ApplicationStopping).ConfigureAwait(false); } } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/ActivityController.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/ActivityController.cs index 022d63ac9..726399b84 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/ActivityController.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/ActivityController.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Text; @@ -86,7 +86,7 @@ public async Task Create(string conversationId, [FromBody] JsonNode bod Token = token, Activity = activity, Services = HttpContext.RequestServices.CreateAsyncScope().ServiceProvider, - }, cancellationToken); + }, cancellationToken).ConfigureAwait(false); return Results.Json(new { id = body["id"] }, statusCode: 201); } diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/DevToolsController.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/DevToolsController.cs index 592ba8485..064d22913 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/DevToolsController.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/DevToolsController.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Net.WebSockets; @@ -51,18 +51,18 @@ public async Task GetSocket() return; } - using var socket = await HttpContext.WebSockets.AcceptWebSocketAsync(); + using var socket = await HttpContext.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false); var id = Guid.NewGuid().ToString(); var buffer = new byte[1024]; _plugin.Sockets.Add(id, socket); - await _plugin.Sockets.Emit(id, new MetaDataEvent(_plugin.MetaData), _lifetime.ApplicationStopping); + await _plugin.Sockets.Emit(id, new MetaDataEvent(_plugin.MetaData), _lifetime.ApplicationStopping).ConfigureAwait(false); try { while (socket.State.HasFlag(WebSocketState.Open)) { - await socket.ReceiveAsync(buffer, _lifetime.ApplicationStopping); + await socket.ReceiveAsync(buffer, _lifetime.ApplicationStopping).ConfigureAwait(false); } } catch (ConnectionAbortedException) @@ -77,7 +77,7 @@ public async Task GetSocket() { if (socket.IsCloseable()) { - await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, _lifetime.ApplicationStopping); + await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, _lifetime.ApplicationStopping).ConfigureAwait(false); } } diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/DevToolsPlugin.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/DevToolsPlugin.cs index 77e02dcb6..2c0fbb423 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/DevToolsPlugin.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/DevToolsPlugin.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Diagnostics.CodeAnalysis; @@ -90,7 +90,7 @@ public IApplicationBuilder Configure(IApplicationBuilder builder) { try { - await next(context); + await next(context).ConfigureAwait(false); } catch (Exception ex) { @@ -168,7 +168,7 @@ await Sockets.Emit( @event.Activity.Conversation ), cancellationToken - ); + ).ConfigureAwait(false); } public async Task OnActivitySent(App app, ISenderPlugin sender, ActivitySentEvent @event, CancellationToken cancellationToken = default) @@ -181,7 +181,7 @@ await Sockets.Emit( @event.Activity.Conversation ), cancellationToken - ); + ).ConfigureAwait(false); } public Task OnActivityResponse(App app, ISenderPlugin sender, ActivityResponseEvent @event, CancellationToken cancellationToken = default) diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/WebSocketCollection.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/WebSocketCollection.cs index 8c4961b56..a57ec39be 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/WebSocketCollection.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/WebSocketCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Collections; @@ -65,7 +65,7 @@ public async Task Emit(IEvent @event, CancellationToken cancellationToken = defa foreach (var socket in _store.Values) { - await socket.SendAsync(buffer, WebSocketMessageType.Text, true, cancellationToken); + await socket.SendAsync(buffer, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false); } } @@ -81,7 +81,7 @@ public async Task Emit(string key, IEvent @event, CancellationToken cancellation }); var buffer = new ArraySegment(payload, 0, payload.Length); - await socket.SendAsync(buffer, WebSocketMessageType.Text, true, cancellationToken); + await socket.SendAsync(buffer, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false); } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.Stream.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.Stream.cs index 2a59f505f..4fb21214e 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.Stream.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.Stream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Collections.Concurrent; @@ -7,6 +7,7 @@ using Microsoft.Teams.Api.Activities; using Microsoft.Teams.Api.Entities; using Microsoft.Teams.Apps.Plugins; +using Microsoft.Teams.Common.Logging; using static Microsoft.Teams.Common.Extensions.TaskExtensions; @@ -21,6 +22,7 @@ public class Stream : IStreamer public int Sequence => _index; public required Func> Send { get; set; } + public ILogger? Logger { get; set; } public event IStreamer.OnChunkHandler OnChunk = (_) => { }; protected int _index = 1; @@ -48,7 +50,7 @@ public void Emit(MessageActivity activity) _queue.Enqueue(activity); _timeout = new Timer(_ => { - _ = Flush(); + _ = FlushSafe(); }, null, 500, Timeout.Infinite); } @@ -63,7 +65,7 @@ public void Emit(TypingActivity activity) _queue.Enqueue(activity); _timeout = new Timer(_ => { - _ = Flush(); + _ = FlushSafe(); }, null, 500, Timeout.Infinite); } @@ -91,7 +93,7 @@ public void Update(string text) // still pending). Wait it out so the final message doesn't race in-flight chunks. while (_id is null || _queue.Count > 0 || _lock.CurrentCount == 0) { - await Task.Delay(50, cancellationToken); + await Task.Delay(50, cancellationToken).ConfigureAwait(false); } if (_text == string.Empty && _attachments.Count == 0) // when only informative updates are present @@ -124,9 +126,10 @@ public void Update(string text) protected async Task Flush() { - if (_queue.Count == 0) return; + bool hasPendingState = _id is null && _count > 0 && _text != string.Empty; + if (_queue.Count == 0 && !hasPendingState) return; - await _lock.WaitAsync(); + await _lock.WaitAsync().ConfigureAwait(false); try { @@ -164,14 +167,16 @@ protected async Task Flush() _count++; } - if (dequeued == 0) return; + // Recalculate inside the lock to account for any concurrent changes. + hasPendingState = _id is null && _count > 0 && _text != string.Empty; + if (dequeued == 0 && !hasPendingState) return; // Send informative updates if (informativeUpdates.Count > 0) { while (informativeUpdates.TryDequeue(out var typing)) { - await SendActivity(typing); + await SendActivity(typing).ConfigureAwait(false); } } @@ -179,14 +184,14 @@ protected async Task Flush() if (_text != string.Empty) { var toSend = new TypingActivity(_text); - await SendActivity(toSend); + await SendActivity(toSend).ConfigureAwait(false); } if (_queue.Count > 0) { _timeout = new Timer(_ => { - _ = Flush(); + _ = FlushSafe(); }, null, 500, Timeout.Infinite); } @@ -209,5 +214,26 @@ async Task SendActivity(TypingActivity toSend) _lock.Release(); } } + + private async Task FlushSafe() + { + try + { + await Flush().ConfigureAwait(false); + } + catch (Exception ex) + { + Logger?.Warn("Stream flush failed; will retry if there is pending state.", ex); + // Reschedule a retry so Close() doesn't spin forever + // waiting for _id to be set after a transient send failure. + if (_queue.Count > 0 || _id is null && _count > 0) + { + _timeout = new Timer(_ => + { + _ = FlushSafe(); + }, null, 1000, Timeout.Infinite); + } + } + } } } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs index f3e3f603e..3752999fa 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Text.Json; @@ -114,22 +114,22 @@ public async Task Send(TActivity activity, Api.Conversatio await client .Conversations .Activities - .UpdateTargetedAsync(reference.Conversation.Id, activity.Id, activity); + .UpdateTargetedAsync(reference.Conversation.Id, activity.Id, activity).ConfigureAwait(false); } else { await client .Conversations .Activities - .UpdateAsync(reference.Conversation.Id, activity.Id, activity); + .UpdateAsync(reference.Conversation.Id, activity.Id, activity).ConfigureAwait(false); } return activity; } var res = isTargeted - ? await client.Conversations.Activities.CreateTargetedAsync(reference.Conversation.Id, activity) - : await client.Conversations.Activities.CreateAsync(reference.Conversation.Id, activity); + ? await client.Conversations.Activities.CreateTargetedAsync(reference.Conversation.Id, activity).ConfigureAwait(false) + : await client.Conversations.Activities.CreateAsync(reference.Conversation.Id, activity).ConfigureAwait(false); #pragma warning restore ExperimentalTeamsTargeted activity.Id = res?.Id; @@ -142,9 +142,10 @@ public IStreamer CreateStream(Api.ConversationReference reference, CancellationT { Send = async activity => { - var res = await Send(activity, reference, cancellationToken); + var res = await Send(activity, reference, cancellationToken).ConfigureAwait(false); return res; - } + }, + Logger = Logger.Child("stream") }; } @@ -157,7 +158,7 @@ public async Task Do(ActivityEvent @event, CancellationToken cancellat "activity", @event, cancellationToken - ); + ).ConfigureAwait(false); var res = (Response?)@out ?? throw new Exception("expected activity response"); Logger.Debug(res); @@ -171,7 +172,7 @@ await Events( "error", new ErrorEvent() { Exception = ex }, cancellationToken - ); + ).ConfigureAwait(false); return new Response(System.Net.HttpStatusCode.InternalServerError, ex.ToString()); } @@ -183,7 +184,7 @@ public async Task Do(HttpContext httpContext, CancellationToken cancell { var request = httpContext.Request; var token = ExtractToken(request); - var activity = await ParseActivity(request); + var activity = await ParseActivity(request).ConfigureAwait(false); if (activity is null) { @@ -210,7 +211,7 @@ public async Task Do(HttpContext httpContext, CancellationToken cancell Activity = activity, Extra = data, Services = httpContext.RequestServices - }, cancellationToken); + }, cancellationToken).ConfigureAwait(false); // convert response metadata to headers foreach (var (key, value) in res.Meta) @@ -235,7 +236,7 @@ await Events( "error", new ErrorEvent() { Exception = ex }, cancellationToken - ); + ).ConfigureAwait(false); return Results.Problem(detail: ex.Message, statusCode: 500); } @@ -258,7 +259,7 @@ public JsonWebToken ExtractToken(HttpRequest httpRequest) } using StreamReader sr = new(httpRequest.Body); - var body = await sr.ReadToEndAsync(); + var body = await sr.ReadToEndAsync().ConfigureAwait(false); Activity? activity = JsonSerializer.Deserialize(body); return activity; diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Functions.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Functions.cs index 60a05e394..21606de1f 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Functions.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Functions.cs @@ -51,10 +51,10 @@ public static IApplicationBuilder AddFunction(this IApplicationBuilder bu /// The callback to handle the function public static IApplicationBuilder AddFunction(this IApplicationBuilder builder, string name, Func, Task> handler) { - return builder.AddFunction(name, context => + return builder.AddFunction(name, async context => { - handler(context).ConfigureAwait(false).GetAwaiter(); - return Task.FromResult(null); + await handler(context).ConfigureAwait(false); + return null; }); } @@ -66,10 +66,10 @@ public static IApplicationBuilder AddFunction(this IApplicationBuilder builder, /// The callback to handle the function public static IApplicationBuilder AddFunction(this IApplicationBuilder builder, string name, Func, Task> handler) { - return builder.AddFunction(name, context => + return builder.AddFunction(name, async context => { - handler(context).ConfigureAwait(false).GetAwaiter(); - return Task.FromResult(null); + await handler(context).ConfigureAwait(false); + return null; }); } @@ -101,7 +101,7 @@ public static IApplicationBuilder AddFunction(this IApplicationBuilder builder, /// The callback to handle the function public static IApplicationBuilder AddFunction(this IApplicationBuilder builder, string name, Func, Task> handler) { - return builder.AddFunction(name, context => handler(context).ConfigureAwait(false).GetAwaiter().GetResult()); + return builder.AddFunction(name, async context => await handler(context).ConfigureAwait(false)); } /// @@ -120,21 +120,21 @@ public static IApplicationBuilder AddFunction(this IApplicationBuilder bu var app = context.RequestServices.GetRequiredService(); var log = app.Logger.Child("functions").Child(name); - if (context.Request.Headers.Authorization.First() is null) + if (context.Request.Headers.Authorization.FirstOrDefault() is null) { - await Results.Unauthorized().ExecuteAsync(context); + await Results.Unauthorized().ExecuteAsync(context).ConfigureAwait(false); return; } if (!context.Request.Headers.TryGetValue("X-Teams-App-Session-Id", out var appSessionId)) { - await Results.Unauthorized().ExecuteAsync(context); + await Results.Unauthorized().ExecuteAsync(context).ConfigureAwait(false); return; } if (!context.Request.Headers.TryGetValue("X-Teams-Page-Id", out var pageId)) { - await Results.Unauthorized().ExecuteAsync(context); + await Results.Unauthorized().ExecuteAsync(context).ConfigureAwait(false); return; } @@ -190,7 +190,7 @@ public static IApplicationBuilder AddFunction(this IApplicationBuilder bu log.Debug(ctx.Data?.ToString()); var res = handler(ctx); log.Debug(res?.ToString()); - await Results.Json(res).ExecuteAsync(context); + await Results.Json(res).ExecuteAsync(context).ConfigureAwait(false); }).RequireAuthorization(EntraTokenAuthConstants.AuthorizationPolicy); }); diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Tabs.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Tabs.cs index ea05a3660..3c25fbda1 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Tabs.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.Tabs.cs @@ -53,7 +53,7 @@ IResult OnGet(string path) { endpoints.MapGet($"/tabs/{name}", async context => { - await OnGet("index.html").ExecuteAsync(context); + await OnGet("index.html").ExecuteAsync(context).ConfigureAwait(false); }); endpoints.MapGet($"/tabs/{name}/{{*path}}", async context => @@ -62,11 +62,11 @@ IResult OnGet(string path) if (path is null) { - await Results.NotFound().ExecuteAsync(context); + await Results.NotFound().ExecuteAsync(context).ConfigureAwait(false); return; } - await OnGet(path).ExecuteAsync(context); + await OnGet(path).ExecuteAsync(context).ConfigureAwait(false); }); }); diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.cs index fd2f32e97..47d1d4a7b 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/Extensions/ApplicationBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Reflection; @@ -75,7 +75,7 @@ public static App UseTeams(this IApplicationBuilder builder, bool routing = true { endpoints.MapPost("/api/messages", async (HttpContext httpContext, CancellationToken cancellationToken) => { - return await aspNetCorePlugin.Do(httpContext, cancellationToken); + return await aspNetCorePlugin.Do(httpContext, cancellationToken).ConfigureAwait(false); }).RequireAuthorization(TeamsTokenAuthConstants.AuthorizationPolicy); } diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.Mcp/Extensions/McpServerBuilder.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.Mcp/Extensions/McpServerBuilder.cs index f4b7f2c51..b8de401e6 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.Mcp/Extensions/McpServerBuilder.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.Mcp/Extensions/McpServerBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Extensions.DependencyInjection; @@ -24,7 +24,7 @@ public static IMcpServerBuilder WithTeamsChatPrompts(this IMcpServerBuilder buil { var mcpPrompt = McpServerPrompt.Create(async (string text) => { - var res = await prompt.Send(UserMessage.Text(text)); + var res = await prompt.Send(UserMessage.Text(text)).ConfigureAwait(false); return ((ModelMessage)res).Content; }, new() { diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.McpClient/McpClientPlugin.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.McpClient/McpClientPlugin.cs index 2e8177efc..18ff865d7 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.McpClient/McpClientPlugin.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.External/Microsoft.Teams.Plugins.External.McpClient/McpClientPlugin.cs @@ -1,4 +1,4 @@ -using Json.Schema; +using Json.Schema; using Microsoft.Teams.AI; using Microsoft.Teams.AI.Prompts; @@ -70,7 +70,7 @@ public McpClientPlugin UseMcpServer(string url, McpClientPluginParams? pluginPar public override async Task OnBuildFunctions(IChatPrompt prompt, FunctionCollection functions, CancellationToken cancellationToken = default) { - await FetchToolsIfNeeded(); + await FetchToolsIfNeeded(cancellationToken).ConfigureAwait(false); foreach (var entry in _mcpServerParams) { @@ -100,7 +100,7 @@ public override async Task OnBuildFunctions(IChatP /// /// Checks if cached values have expired or if tools have never been fetched. Performs parallel fetching for efficiency. /// - internal async Task FetchToolsIfNeeded() + internal async Task FetchToolsIfNeeded(CancellationToken cancellationToken = default) { var fetchNeeded = new List>(); @@ -132,16 +132,16 @@ internal async Task FetchToolsIfNeeded() { string url = entry.Key; McpClientPluginParams pluginParams = entry.Value; - tasks.Add(FetchToolsFromServer(new Uri(url), pluginParams)); + tasks.Add(FetchToolsFromServer(new Uri(url), pluginParams, cancellationToken)); } try { - await Task.WhenAll(tasks); + await Task.WhenAll(tasks).ConfigureAwait(false); } - catch + catch (Exception ex) { - // Suppress all exceptions, but tasks are still awaited - // Individual task exceptions will be handled below + // Suppress aggregate exception; individual task exceptions are handled below + _logger.Debug("One or more MCP tool fetch tasks failed", ex); } var results = fetchNeeded.Zip(tasks); @@ -179,11 +179,11 @@ internal async Task FetchToolsIfNeeded() } } - internal async Task> FetchToolsFromServer(Uri url, McpClientPluginParams pluginParams) + internal async Task> FetchToolsFromServer(Uri url, McpClientPluginParams pluginParams, CancellationToken cancellationToken = default) { IClientTransport transport = CreateTransport(url, pluginParams.Transport, pluginParams.HeadersFactory()); - var client = await McpClientFactory.CreateAsync(transport); - var tools = await client.ListToolsAsync(); + var client = await McpClientFactory.CreateAsync(transport, cancellationToken: cancellationToken).ConfigureAwait(false); + var tools = await client.ListToolsAsync(cancellationToken: cancellationToken).ConfigureAwait(false); // Convert MCP tools to our format var mappedTools = tools.Select(t => new McpToolDetails() @@ -226,7 +226,7 @@ internal AI.Function CreateFunctionFromTool(Uri url, McpToolDetails tool, McpCli try { _logger.Debug($"Making call to {url} for tool {tool.Name}"); - string result = await CallMcpTool(url, tool, args.AsReadOnly(), pluginParams); + string result = await CallMcpTool(url, tool, args.AsReadOnly(), pluginParams).ConfigureAwait(false); _logger.Debug($"Received result from {tool.Name}: {result}"); return result; } @@ -242,8 +242,8 @@ internal AI.Function CreateFunctionFromTool(Uri url, McpToolDetails tool, McpCli internal async Task CallMcpTool(Uri url, McpToolDetails tool, IReadOnlyDictionary args, McpClientPluginParams pluginParams) { IClientTransport transport = CreateTransport(url, pluginParams.Transport, pluginParams.HeadersFactory()); - var client = await McpClientFactory.CreateAsync(transport); - var response = await client.CallToolAsync(tool.Name, args); + var client = await McpClientFactory.CreateAsync(transport).ConfigureAwait(false); + var response = await client.CallToolAsync(tool.Name, args).ConfigureAwait(false); if (response.IsError == true) { diff --git a/Tests/Microsoft.Teams.AI.Tests/ChatPluginTests.cs b/Tests/Microsoft.Teams.AI.Tests/ChatPluginTests.cs index 1d8273696..010d6b1a1 100644 --- a/Tests/Microsoft.Teams.AI.Tests/ChatPluginTests.cs +++ b/Tests/Microsoft.Teams.AI.Tests/ChatPluginTests.cs @@ -49,7 +49,7 @@ public async Task Test_ChatPlugin_HooksCalled(string hookName) chatPlugin.Verify(p => p.OnBuildFunctions(It.IsAny>(), It.IsAny(), It.IsAny()), Times.Once); break; case "OnBuildInstructions": - chatPlugin.Verify(p => p.OnBuildInstructions(It.IsAny>(), It.IsAny()), Times.Once); + chatPlugin.Verify(p => p.OnBuildInstructions(It.IsAny>(), It.IsAny(), It.IsAny()), Times.Once); break; } diff --git a/Tests/Microsoft.Teams.AI.Tests/Utils/TestChatPlugin.cs b/Tests/Microsoft.Teams.AI.Tests/Utils/TestChatPlugin.cs index f2f6c75f6..58390b731 100644 --- a/Tests/Microsoft.Teams.AI.Tests/Utils/TestChatPlugin.cs +++ b/Tests/Microsoft.Teams.AI.Tests/Utils/TestChatPlugin.cs @@ -30,7 +30,7 @@ public virtual Task OnBuildFunctions(IChatPrompt OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions) + public virtual Task OnBuildInstructions(IChatPrompt prompt, DeveloperMessage? instructions, CancellationToken cancellationToken = default) { return Task.FromResult(instructions); }