Używam Microsoft Asp.net WebApi2 hostowanego przez IIS. Chciałbym po prostu zarejestrować treść żądania (XML lub JSON) i treść odpowiedzi dla każdego posta.
Nie ma nic specjalnego w tym projekcie ani w kontrolerze przetwarzającym post. Nie interesuje mnie używanie struktur rejestrowania, takich jak nLog, elmah, log4net lub wbudowanych funkcji śledzenia internetowego interfejsu API, chyba że jest to konieczne.
Chcę po prostu wiedzieć, gdzie umieścić mój kod logowania i jak uzyskać rzeczywisty kod JSON lub XML z przychodzących i wychodzących żądań i odpowiedzi.
Metoda mojego posta kontrolera:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
user2315985
źródło
źródło
Odpowiedzi:
Polecam użycie
DelegatingHandler
. Wtedy nie będziesz musiał martwić się o kod logowania w kontrolerach.Po prostu zastąp
Trace.WriteLine
kodem logowania i zarejestruj program obsługi wWebApiConfig
następujący sposób:Oto pełna dokumentacja firmy Microsoft dotycząca programów obsługi wiadomości .
źródło
task.Result.Content
zwracaSystem.Net.Http.ObjectContent
. Czy istnieje sposób na uzyskanie zamiast tego surowego pliku xml / json?ContinueWith
iResult
są niebezpiecznymi interfejsami API. Byłoby znacznie lepiej użyćawait
zamiast tego, np.var result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
nie powoduje błędu informującego, że strumień żądania został już odczytany w pewnych okolicznościach?Istnieje wiele podejść do ogólnej obsługi rejestrowania żądań / odpowiedzi dla każdego wywołania metody WebAPI:
ActionFilterAttribute
: Można napisać własneActionFilterAttribute
i ozdobić kontroler / metody akcji, aby umożliwić logowanie.Wada: Musisz udekorować każdy kontroler / metodę (nadal możesz to zrobić na kontrolerze podstawowym, ale nadal nie rozwiązuje to problemów związanych z cięciem krzyżowym.
Zastąp
BaseController
i obsłuż rejestrowanie w tym miejscu.Wada: Spodziewamy się / zmuszamy kontrolery do dziedziczenia z niestandardowego kontrolera podstawowego.
Korzystanie
DelegatingHandler
.Zaleta: tym podejściem nie dotykamy kontrolera / metody. Delegujący program obsługi siedzi w izolacji i wdzięcznie obsługuje rejestrowanie żądań / odpowiedzi.
Aby uzyskać bardziej szczegółowy artykuł, zapoznaj się z tym http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
źródło
Jedną z dostępnych opcji jest tworzenie filtru akcji i dekorowanie nim WebApiController / ApiMethod.
Filtr atrybutu
Kontroler WebApi
lub
Mam nadzieję że to pomoże.
źródło
Uzyskanie dostępu do wiadomości z żądaniem jest łatwe. Twoja klasa bazowa
ApiController
zawiera.Request
właściwość , która, jak sugeruje nazwa, zawiera żądanie w formie przeanalizowanej. Po prostu sprawdzasz go pod kątem tego, co chcesz zarejestrować, i przekazujesz go do swojego centrum logowania, cokolwiek to jest. Ten kod możesz umieścić na początku swojej akcji, jeśli chcesz to zrobić tylko dla jednej lub kilku osób.Jeśli musisz to zrobić dla wszystkich akcji (wszystko to znaczy więcej niż garstka, którą można zarządzać), to możesz zrobić
.ExecuteAsync
metodę nadpisania , aby przechwycić każde wywołanie akcji dla twojego kontrolera.źródło
ExecuteAsync
jest tym, co jest wywoływane przez framework, a implementacja klasy kontrolera podstawowego jest tym, co faktycznie powoduje wykonanie akcji. To po prostu wywołanie logowania w ramach już trwającej realizacji. Jedyną karą jest czas na wykonanie faktycznego logowania.Wydaje się, że to dość stary wątek, ale warto udostępnić inne rozwiązanie.
Możesz dodać tę metodę w swoim pliku global.asax, która będzie uruchamiana po zakończeniu żądania HTTP.
źródło
To naprawdę stary temat, ale spędziłem dużo czasu (przeszukując internet), aby to zrobić, więc po prostu opublikuję tutaj swoje rozwiązanie.
Pojęcie
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
źródło