У меня есть веб-API, который принимает простую строку данных, разделенных запятыми, из части телеметрического оборудования в поле. Затем необходимо выполнить обработку, чтобы установить, выполнять или нет различные действия, а затем выполнить эти действия. Это такие вещи, как хранение данных в базе данных или запуск уведомлений по электронной почте. API просто нужно ответить, чтобы сказать, что данные были получены, и тогда вся работа может произойти на сервере, в то время как API продолжает принимать другие запросы. Каждые несколько секунд от многих тысяч единиц оборудования поступают тысячи запросов.
Поскольку я новичок в ASP.NET MVC, я не уверен, что это лучший способ сделать это. Я бы хотел, чтобы контроллер API выполнил некоторые базовые проверки, а затем ответил успешным ответом (в настоящее время сообщение «Обработано»). Для выполнения работы в фоновом режиме необходимо отправить данные другим процессам. Аппаратное обеспечение, которое делает публикацию, не заинтересовано в успехе последующей работы, поскольку оно должно быстро разорвать соединение до следующего отчета. Поскольку существует так много аппаратных отчетов, действующие соединения должны завершаться и закрываться как можно быстрее.
Должны ли эти дополнительные функции быть асинхронными функциями в отдельных классах? Если это так, то должны ли они быть недействительными, поскольку они могут выполняться в фоновом режиме, пока http-запрос завершен, т.е. их не нужно ждать? Контроллер API становится довольно раздутым из-за кода, так как существует так много возможных подпрограмм.
public class MyApiController : ApiController
{
public class RecievedPost
{
public string Data { get; set; }
}
private BaseContext db = new BaseContext();
public HttpResponseMessage PostResponse([FromBody] RecievedPost recievedPost)
{
try
{
string[] dataArray = recievedPost.Data.Split(',');
//run various checks and trigger various other processes based on the results.
}
return new HttpResponseMessage()
{
Content = new StringContent("Processed")
};
}
catch (Exception ex)
{
return new HttpResponseMessage()
{
Content = new StringContent("API Error - " + ex.ToString())
};
}
}