#c# #dependency-injection #async-await #asp.net-web-api2 #autofac
#c# #внедрение зависимостей #async-await #asp.net-web-api2 #autofac
Вопрос:
Я выполняю вызов PostAsync на бизнес-уровне моего приложения WebAPI.
Используя AutoFac, я настраиваю свои привязки следующим образом:
builder.RegisterGeneric(typeof(SqlServerRepository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
builder.RegisterType<WspSQLDbContext>()
.As<DbContext>()
.InstancePerLifetimeScope();
Репозиторий вводится в контроллер:
public KenSciConnector(log4net.ILog logger, IRepository<KenSciBatch> kensciBatchRepository) {
_logger = logger;
_kensciBatchRepository = kensciBatchRepository;
}
Функция, которая вызывает асинхронную функцию, выглядит следующим образом:
public Response SendToVendor(Observation observation) {
Response batchingResponse;
// some logic
var sendResponse = SendToKensci(requestObject, batch);
return batchingResponse;
}
… и функция, которая фактически выполняет асинхронный вызов, выглядит следующим образом:
private async Task<Response> SendToKensci(KenSciRequest requestObject, KenSciBatch kenSciBatch) {
var response = new Response();
try {
var httpClient = new HttpClient();
await httpClient
.PostAsync(httpClient.BaseAddress, new StringContent(seralizedObject, Encoding.UTF8, "application/json"))
.ContinueWith((requestTask) => UpdateBatch(requestTask, kenSciBatch));
} catch (Exception e) {
// some logic
return response;
}
// some logic
return response;
}
В функции обратного вызова, когда я пытаюсь обновить, я получаю исключение, которое DbContext
уже удалено.
private void UpdateBatch(Task<HttpResponseMessage> requestTask, KenSciBatch kenSciBatch) {
try {
if (requestTask.Result.StatusCode == HttpStatusCode.OK) {
kenSciBatch.Status = BatchStatus.Sent;
_kensciBatchRepository.Update(kenSciBatch);
}
} catch (Exception ex) {
throw ex;
}
}
Комментарии:
1. да, это была проблема. put — это ответ.
Ответ №1:
Здесь:
var sendResponse = SendToKensci(requestObject, batch);
вы не ожидаете SendToKensci
(который возвращает Task
), и поэтому иногда в середине его выполнения — контекст удаляется (потому что вы SendToVendor
уже покинули функцию)