Я использую Microsoft Asp.net WebApi2, размещенный на IIS. Я очень просто хотел бы регистрировать тело запроса (XML или JSON) и тело ответа для каждого сообщения.
Нет ничего особенного ни в этом проекте, ни в контроллере, обрабатывающем пост. Меня не интересует использование фреймворков для ведения журналов, таких как nLog, elmah, log4net, или встроенных функций трассировки веб-API, если в этом нет необходимости.
Я просто хочу знать, где разместить мой код ведения журнала и как получить фактический JSON или XML из входящего и исходящего запроса и ответа.
Мой метод сообщения контроллера:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
user2315985
источник
источник
Ответы:
Я бы порекомендовал использовать
DelegatingHandler
. Тогда вам не нужно будет беспокоиться о коде журналирования в ваших контроллерах.Просто замените
Trace.WriteLine
своим кодом регистрации и зарегистрируйте обработчикWebApiConfig
следующим образом:Вот полная документация Microsoft для обработчиков сообщений .
источник
task.Result.Content
возвращаетсяSystem.Net.Http.ObjectContent
. Есть ли способ вместо этого получить необработанный xml / json?ContinueWith
иResult
опасны API. Было бы гораздо лучше использоватьawait
вместо этого, то есть,var result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
приводит ли вызов к ошибке, говорящей, что поток запроса уже был прочитан при определенных обстоятельствах?Существует несколько подходов к общей обработке ведения журнала запросов / ответов для каждого вызова метода WebAPI:
ActionFilterAttribute
: Можно написать собственныеActionFilterAttribute
и украсить методы контроллера / действия, чтобы включить ведение журнала.Против: вам нужно украсить каждый контроллер / методы (вы все равно можете сделать это на базовом контроллере, но все же это не решает сквозные проблемы.
Переопределите
BaseController
и обработайте там ведение журнала.Против: Мы ожидаем / заставляем контроллеры наследовать от настраиваемого базового контроллера.
Использование
DelegatingHandler
.Преимущество: мы не касаемся здесь контроллера / метода с помощью этого подхода. Делегирующий обработчик находится изолированно и аккуратно обрабатывает ведение журнала запросов / ответов.
Для получения более подробной статьи обратитесь к http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
источник
Один из возможных вариантов - создать фильтр действий и украсить им свой WebApiController / ApiMethod.
Атрибут фильтра
Контроллер WebApi
или
Надеюсь это поможет.
источник
Получить доступ к сообщению запроса просто. Ваш базовый класс
ApiController
содержит.Request
свойство , которое, как следует из названия, содержит запрос в проанализированной форме. Вы просто проверяете его на предмет того, что вы хотите зарегистрировать, и передаете это своему объекту ведения журнала, каким бы он ни был. Этот код вы можете поместить в начало вашего действия, если вам нужно сделать это для одного или нескольких.Если вам нужно сделать это для всех действий (все означает нечто большее, чем управляемая горстка), тогда вы можете переопределить
.ExecuteAsync
метод для захвата каждого вызова действия для вашего контроллера.источник
ExecuteAsync
это то, что вызывается фреймворком, а реализация базового класса контроллера - это то, что фактически выполняет действие. Это просто вызов вашего журнала как часть уже происходящего выполнения. Единственное наказание - это время для фактической регистрации.Кажется, это довольно старый поток, но вам нужно поделиться другим решением.
Вы можете добавить этот метод в свой файл global.asax, который будет запускаться каждый раз после завершения HTTP-запроса.
источник
Это действительно старая тема, но я потратил много времени (поискал в Интернете), чтобы сделать это, поэтому я просто опубликую здесь свое решение.
Концепция
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
источник