Я хочу добавить время запроса в заголовки ответа на запрос к модулю Нэнси. Я добавил несколько обработчиков запросов до/после в RequestStartup и без проблем добавил заголовки (пример ниже), и все было хорошо. Я также добавил обработчик OnError в ApplicationStartup, чтобы перехватывать ошибки и возвращать хорошо отформатированный ответ Json.
pipelines.BeforeRequest += ctx =>
{
ctx.Items.Add("X-RequestStart", DateTime.Now.ToString());
return null;
};
pipelines.AfterRequest += ctx =>
{
var now = DateTime.Now;
try
{
//Not got around to forcing the culture on the datetime parsing yet...
var startTime = DateTime.Parse(ctx.Items["X-RequestStart"].ToString());
ctx.Response.Headers.Add("X-RequestStart", startTime.ToString(CultureInfo.InvariantCulture));
ctx.Response.Headers.Add("X-RequestComplete", now.ToString(CultureInfo.InvariantCulture));
ctx.Response.Headers.Add("X-RequestDuration", (now - startTime).ToString());
}
catch (Exception)
{
ctx.Response.Headers.Add("X-RequestComplete", now.ToString(CultureInfo.InvariantCulture));
}
};
pipelines.OnError += (ctx, exception) =>
{
return ErrorResponse.FromException(exception);
};
Однако я заметил, что когда у меня возникает ошибка, действие AfterRequest не выполняется, поэтому у меня нет заголовков синхронизации в ответе об ошибке. Я пытался перенести обработку запроса до/после на запуск приложения, но это тоже не дало результата.
На самом деле вопрос состоит из двух частей: во-первых, можно ли заставить фреймворк выполнять действие AfterRequest после того, как было выполнено действие OnError, или конвейер настроен таким образом, чтобы предотвратить это, а во-вторых, должны ли они выполняться до/ после действий запроса быть частью RequestStartup или ApplicationStartup? ApplicationStartup кажется разумным для обработки ошибок, тогда как RequestStartup кажется разумным для взаимодействия с заголовками ответов, как это должно быть для каждого запроса, но я не уверен, существует ли соглашение для этого, или мои предположения были неверны.