Saya mengembalikan NotFound IHttpActionResult
, ketika sesuatu tidak ditemukan dalam tindakan GET WebApi saya. Bersamaan dengan tanggapan ini, saya ingin mengirim pesan khusus dan / atau pesan pengecualian (jika ada). Arus ApiController
's NotFound()
metode tidak memberikan kelebihan untuk lulus pesan.
Apakah ada cara untuk melakukan ini? atau saya harus menulis kebiasaan saya sendiri IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Ajay Jadhav
sumber
sumber
Jawaban:
Anda perlu menulis hasil tindakan Anda sendiri jika Anda ingin menyesuaikan bentuk pesan respons.
Kami ingin memberikan bentuk pesan respons yang paling umum di luar kotak untuk hal-hal seperti 404 kosong sederhana, tetapi kami juga ingin membuat hasil ini sesederhana mungkin; salah satu keuntungan utama menggunakan hasil tindakan adalah membuat metode tindakan Anda lebih mudah untuk pengujian unit. Semakin banyak properti yang kami tempatkan pada hasil tindakan, semakin banyak hal yang perlu dipertimbangkan pengujian unit Anda untuk memastikan metode tindakan melakukan apa yang Anda harapkan.
Saya sering menginginkan kemampuan untuk memberikan pesan khusus juga, jadi jangan ragu untuk mencatat bug agar kami dapat mempertimbangkan untuk mendukung hasil tindakan tersebut di rilis mendatang: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Namun, satu hal yang menyenangkan tentang hasil tindakan adalah Anda selalu dapat menulis sendiri dengan cukup mudah jika Anda ingin melakukan sesuatu yang sedikit berbeda. Inilah cara Anda melakukannya dalam kasus Anda (dengan asumsi Anda menginginkan pesan kesalahan dalam teks / biasa; jika Anda menginginkan JSON, Anda akan melakukan sesuatu yang sedikit berbeda dengan konten):
Kemudian, dalam metode tindakan Anda, Anda bisa melakukan sesuatu seperti ini:
Jika Anda menggunakan kelas dasar pengontrol kustom (alih-alih mewarisi langsung dari ApiController), Anda juga bisa menghilangkan "this." bagian (yang sayangnya diperlukan saat memanggil metode ekstensi):
sumber
Berikut ini satu baris untuk mengembalikan IHttpActionResult NotFound dengan pesan sederhana:
sumber
Anda bisa menggunakan
ResponseMessageResult
jika Anda suka:ya, jika Anda membutuhkan versi yang jauh lebih pendek, maka saya rasa Anda perlu menerapkan hasil tindakan kustom Anda.
sumber
Anda dapat menggunakan properti ReasonPhrase dari kelas HttpResponseMessage
sumber
Anda dapat membuat hasil konten kustom yang dinegosiasikan seperti yang disarankan d3m3t3er. Bagaimanapun saya akan mewarisi. Selain itu, jika Anda hanya membutuhkannya untuk menampilkan NotFound, Anda tidak perlu menginisialisasi status http dari konstruktor.
sumber
Saya menyelesaikannya hanya dengan mengambil dari
OkNegotiatedContentResult
dan menimpa kode HTTP dalam pesan respons yang dihasilkan. Kelas ini memungkinkan Anda mengembalikan isi konten dengan kode respons HTTP apa pun.sumber
Jika Anda mewarisi dari basis
NegotitatedContentResult<T>
, seperti yang disebutkan, dan Anda tidak perlu mengubahcontent
(misalnya Anda hanya ingin mengembalikan string), maka Anda tidak perlu menggantiExecuteAsync
metode ini.Yang perlu Anda lakukan adalah memberikan definisi tipe yang sesuai dan konstruktor yang memberi tahu basis Kode Status HTTP mana yang akan dikembalikan. Segala sesuatu yang lain hanya berfungsi.
Berikut adalah contoh untuk keduanya
NotFound
danInternalServerError
:Dan kemudian Anda dapat membuat metode ekstensi yang sesuai untuk
ApiController
(atau melakukannya di kelas dasar jika Anda memilikinya):Dan kemudian mereka bekerja seperti metode bawaan. Anda dapat memanggil yang sudah ada
NotFound()
atau Anda dapat memanggil kebiasaan baru AndaNotFound(myErrorMessage)
.Dan tentu saja, Anda dapat menyingkirkan jenis string "hard-code" dalam definisi jenis kustom dan membiarkannya generik jika Anda mau, tetapi Anda mungkin harus mengkhawatirkan
ExecuteAsync
hal - hal tersebut, bergantung pada apa<T>
sebenarnya Anda .Anda dapat melihat di atas kode sumber untuk
NegotiatedContentResult<T>
melihat semua yang dilakukannya. Tidak banyak untuk itu.sumber
Saya perlu membuat
IHttpActionResult
instance di badanIExceptionHandler
kelas, untuk mengaturExceptionHandlerContext.Result
properti. Namun saya juga ingin mengatur kebiasaanReasonPhrase
.Saya menemukan bahwa a
ResponseMessageResult
could wrap aHttpResponseMessage
(yang memungkinkan ReasonPhrase disetel dengan mudah).Sebagai contoh:
sumber
Iknow PO bertanya dengan teks pesan, tetapi opsi lain untuk mengembalikan 404 adalah membuat metode mengembalikan IHttpActionResult dan menggunakan fungsi StatusCode
sumber
Jawaban di sini kehilangan sedikit masalah cerita pengembang. The
ApiController
kelas masih memperlihatkanNotFound()
metode yang pengembang dapat menggunakan. Ini akan menyebabkan sekitar 404 respon mengandung hasil tubuh yang tidak terkontrol.Saya menyajikan di sini beberapa bagian kode " metode ApiController NotFound yang lebih baik " yang akan memberikan metode rawan kesalahan yang lebih sedikit yang tidak mengharuskan pengembang untuk mengetahui "cara yang lebih baik untuk mengirim 404".
ApiController
dipanggilApiController
NotFound
metodenya agar pengembang dapat menggunakan api pertama yang tersedia[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
yang ingin Anda dorongNegotiatedContentResult
. lihat terlampir kelas NotFoundResult yang lebih baik .sumber