Ответ 1
Обработчики сообщений вызываются в том же порядке, в котором они отображаются в
MessageHandlers
коллекция. Поскольку они вложены, ответ сообщение перемещается в другом направлении. То есть последний обработчик первый, чтобы получить ответное сообщение.
Убедитесь, что обработчик регистрации зарегистрирован в начале конвейера. Предпочтительно сначала.
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.MessageHandlers.Add(new LoggingHandler(...));
//...add other handlers
config.MessageHandlers.Add(new MessageHandler1());
config.MessageHandlers.Add(new MessageHandler2());
// Other code not shown...
}
}
Таким образом, у любых других обработчиков будет возможность заполнить ответ и зарегистрировать эту информацию.
Вы также можете упростить класс, используя синтаксис async/await, чтобы получить доступ к очистителю ответа.
public class LoggingHandler : DelegatingHandler {
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
//...Extract and log request
LogRequest(request);
// Send the request on to the inner handler(s) and get the response
var response = await base.SendAsync(request, cancellationToken);
//...Extract details from response for logging
LogResponse(response);
return response;
}
private void LogRequest(HttpRequestMessage request) {
//... code removed for brevity
}
private void LogResponse(HttpResponseMessage response) {
//... code removed for brevity
}
}
Должен иметь доступ к необходимым данным из ответа перед его возвратом.