#angular #asp.net-core #cors #elsa-workflows
Вопрос:
Я запускаю образец панели мониторинга Elsa-Core — AspNetCore Monolith.
Рабочий процесс:,
Эта проблема возникает при выполнении действия HttpReponse, точка HttpEndpoint работает нормально
Я получаю ошибку на клиенте, которую я не могу поймать на сервере, я думаю, что проблема возникает в:
Elsa.Activities.Http -> WriteHttpResponse -> OnExecuteAsync(ActivityExecutionContext context)
Кажется, что response.WriteAsync
срабатывает какой-то фоновый поток, который в какой-то момент завершается сбоем, но исключение не улавливается:
/// <summary>
/// The headers to send along with the response.
/// </summary>
[ActivityProperty(Hint = "Additional headers to write.", UIHint = ActivityPropertyUIHints.Json)]
public HttpResponseHeaders? ResponseHeaders { get; set; }
protected override async ValueTask<IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
{
var httpContext = _httpContextAccessor.HttpContext ?? new DefaultHttpContext();
var response = httpContext.Response;
...
var bodyText = Content;
if (!string.IsNullOrWhiteSpace(bodyText))
{
try
{
await response.WriteAsync(bodyText, context.CancellationToken);
await Task.Delay(5000); <--CLIENT FAILS HERE
Console.WriteLine("Delay End");
}
catch(Exception ex)
{
var z = ex;
}
}
return Done();
}
Функция API не вернулась, когда клиент уже вышел из строя:
Клиент говорит только «Неизвестная внутренняя ошибка, Статус = 0».
Экземпляры рабочего процесса создаются и завершаются нормально
Этого не происходит, если вызов сделан из браузера, поэтому он должен быть связан с CORS
Я использую Angular 10, попробовал в чистом пустом проекте, без учетных данных, без дополнительных заголовков в http-вызове
Ответ №1:
Обязательно обновите свой Startup
класс до:
- Добавьте службы CORS и
- Добавьте промежуточное программное обеспечение CORS.
Как вы уже поняли, обязательно добавьте компонент промежуточного программного обеспечения CORS перед вызовом app.UseHttpActivities()
(который является промежуточным программным обеспечением, обрабатывающим запросы рабочего процесса HTTP).
Пример кода в ConfigureServices
:
// Allow arbitrary client browser apps to access the API for demo purposes only.
// In a production environment, make sure to allow only origins you trust.
services.AddCors(cors => cors.AddDefaultPolicy(policy => policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().WithExposedHeaders("Content-Disposition")));
Пример кода в Configure
:
app
.UseCors()
.UseHttpActivities()
.UseRouting()
.UseEndpoints(endpoints => { endpoints.MapControllers(); });
С учетом этого ваши вызовы AJAX из вашего приложения Angular теперь должны быть разрешены.
Комментарии:
1. Мне нужно было только переместить строку «UseCors» наверх, и я уже «участник». Поздравляю и благодарю вас и всех людей, создающих этот замечательный проект.