Saya menggunakan Microsoft Asp.net WebApi2 yang dihosting di IIS. Saya hanya ingin mencatat badan permintaan (XML atau JSON) dan badan respons untuk setiap posting.
Tidak ada yang istimewa tentang proyek ini atau pengontrol yang memproses pos. Saya tidak tertarik menggunakan kerangka kerja logging seperti nLog, elmah, log4net, atau fitur pelacakan bawaan dari API web kecuali jika diperlukan.
Saya hanya ingin tahu di mana harus meletakkan kode logging saya dan bagaimana mendapatkan JSON atau XML yang sebenarnya dari permintaan dan respons yang masuk dan keluar.
Metode posting pengontrol saya:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
pengguna2315985
sumber
sumber
Jawaban:
Saya akan merekomendasikan menggunakan file
DelegatingHandler
. Maka Anda tidak perlu khawatir tentang kode logging apa pun di pengontrol Anda.Cukup ganti
Trace.WriteLine
dengan kode logging Anda dan daftarkan penangannyaWebApiConfig
seperti ini:Berikut adalah dokumentasi Microsoft lengkap untuk Penangan Pesan .
sumber
task.Result.Content
kembaliSystem.Net.Http.ObjectContent
. Apakah ada cara untuk mendapatkan xml / json mentah sebagai gantinya?ContinueWith
danResult
merupakan API yang berbahaya. Akan jauh lebih baik jika digunakanawait
sebagai gantinya, yaituvar result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
tidak menghasilkan kesalahan yang mengatakan bahwa aliran permintaan telah dibaca dalam keadaan tertentu?Ada beberapa pendekatan untuk menangani pencatatan Permintaan / Respons secara umum untuk setiap panggilan metode WebAPI:
ActionFilterAttribute
: Seseorang dapat menulis kustomActionFilterAttribute
dan menghias metode pengontrol / tindakan untuk mengaktifkan logging.Kontra: Anda perlu menghias setiap pengontrol / metode (Anda masih bisa melakukannya di pengontrol dasar, tetapi tetap tidak mengatasi masalah lintas sektoral.
Timpa
BaseController
dan tangani logging di sana.Kontra: Kami mengharapkan / memaksa pengontrol untuk mewarisi dari pengontrol basis khusus.
Menggunakan
DelegatingHandler
.Keuntungan: Kami tidak menyentuh pengontrol / metode di sini dengan pendekatan ini. Penangan pendelegasi duduk dalam isolasi dan dengan baik menangani pencatatan permintaan / tanggapan.
Untuk artikel yang lebih mendalam, lihat http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi ini .
sumber
Salah satu opsi yang Anda miliki adalah menggunakan membuat filter tindakan dan menghias WebApiController / ApiMethod dengannya.
Atribut Filter
Pengontrol WebApi
atau
Semoga ini membantu.
sumber
Mendapatkan akses untuk meminta pesan itu mudah. Kelas dasar
ApiController
Anda , berisi.Request
properti , yang, seperti namanya, berisi permintaan dalam bentuk parsing. Anda cukup memeriksanya untuk apa pun yang ingin Anda catat dan meneruskannya ke fasilitas logging Anda, mana pun itu. Kode ini dapat Anda letakkan di awal tindakan Anda, jika Anda perlu melakukannya hanya untuk satu atau sedikit.Jika Anda perlu melakukannya pada semua tindakan (semua berarti lebih dari segelintir yang dapat dikelola), maka yang dapat Anda lakukan adalah mengganti
.ExecuteAsync
metode untuk menangkap setiap panggilan tindakan untuk pengontrol Anda.sumber
ExecuteAsync
adalah apa yang disebut oleh kerangka kerja, dan implementasi kelas pengontrol dasar adalah apa yang sebenarnya membuat tindakan dieksekusi. Ini hanya memanggil ke logging Anda sebagai bagian dari eksekusi yang sudah terjadi. Hukuman mereka hanya di sini adalah waktu untuk melakukan penebangan yang sebenarnya.Ini tampaknya merupakan utas yang cukup lama tetapi bekerja berbagi solusi lain.
Anda dapat menambahkan metode ini di file global.asax Anda yang akan dipicu setiap setelah permintaan HTTP berakhir.
sumber
Ini benar-benar topik lama tetapi saya menghabiskan banyak waktu (mencari di internet) untuk melakukan hal ini jadi saya akan memposting solusi saya di sini.
Konsep
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
sumber