From c87e282bc2f85ae0e2c60aa7a354743fe64dcedf Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 17 May 2021 13:11:55 +0200 Subject: [PATCH] Fix task cancellation issues This fixes an issue where HTTP requests invoking workflows are aborted mid-way when e.g. WriteHttpResponse executes, causing the pipleine to trigger the RequestAborted cancelation token (which is used throughout the request into other services). --- .../Activities/WriteHttpResponse/WriteHttpResponse.cs | 9 ++++++--- .../Middleware/HttpRequestMiddleware.cs | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/activities/Elsa.Activities.Http/Activities/WriteHttpResponse/WriteHttpResponse.cs b/src/activities/Elsa.Activities.Http/Activities/WriteHttpResponse/WriteHttpResponse.cs index 38f5066cf..394ca272e 100644 --- a/src/activities/Elsa.Activities.Http/Activities/WriteHttpResponse/WriteHttpResponse.cs +++ b/src/activities/Elsa.Activities.Http/Activities/WriteHttpResponse/WriteHttpResponse.cs @@ -8,6 +8,7 @@ using Elsa.Expressions; using Elsa.Services; using Elsa.Services.Models; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Localization; // ReSharper disable once CheckNamespace @@ -38,9 +39,10 @@ namespace Elsa.Activities.Http UIHint = ActivityPropertyUIHints.Dropdown, Hint = "The HTTP status code to write.", Options = new[] { HttpStatusCode.OK, HttpStatusCode.Created, HttpStatusCode.Accepted, HttpStatusCode.NoContent, HttpStatusCode.Redirect, HttpStatusCode.BadRequest, HttpStatusCode.NotFound, HttpStatusCode.Conflict }, - SupportedSyntaxes = new[] { SyntaxNames.Literal, SyntaxNames.JavaScript, SyntaxNames.Liquid } + SupportedSyntaxes = new[] { SyntaxNames.Literal, SyntaxNames.JavaScript, SyntaxNames.Liquid }, + DefaultValue = HttpStatusCode.OK )] - public HttpStatusCode StatusCode { get; set; } + public HttpStatusCode StatusCode { get; set; } = HttpStatusCode.OK; /// /// The content to send along with the response @@ -55,9 +57,10 @@ namespace Elsa.Activities.Http UIHint = ActivityPropertyUIHints.Dropdown, Hint = "The HTTP content type header to write.", Options = new[] { "text/plain", "text/html", "application/json", "application/xml" }, + DefaultValue = "text/plain", SupportedSyntaxes = new[] { SyntaxNames.Literal, SyntaxNames.JavaScript, SyntaxNames.Liquid } )] - public string? ContentType { get; set; } + public string? ContentType { get; set; } = "text/plain"; /// /// The headers to send along with the response. diff --git a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs index 819211238..d0e0f2ad8 100644 --- a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs +++ b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Elsa.Activities.Http.Bookmarks; using Elsa.Activities.Http.Extensions; @@ -31,9 +32,9 @@ namespace Elsa.Activities.Http.Middleware IWorkflowBlueprintReflector workflowBlueprintReflector, IEnumerable contentParsers) { + var cancellationToken = CancellationToken.None; // Prevent half-way request abortion (which also happens when WriteHttpResponse writes to the response). var path = httpContext.Request.Path.Value.ToLowerInvariant(); var method = httpContext.Request.Method!.ToLowerInvariant(); - var cancellationToken = httpContext.RequestAborted; var request = httpContext.Request; request.TryGetCorrelationId(out var correlationId); var useDispatch = httpContext.Request.GetUseDispatch();