Saya telah mengembangkan dengan WebApi dan telah pindah ke WebApi2 di mana Microsoft telah memperkenalkan IHttpActionResult
Antarmuka baru yang tampaknya direkomendasikan untuk digunakan daripada mengembalikan a HttpResponseMessage
. Saya bingung tentang kelebihan dari Antarmuka baru ini. Tampaknya terutama hanya menyediakan cara yang sedikit lebih mudah untuk membuat HttpResponseMessage
.
Saya akan mengajukan argumen bahwa ini adalah "abstraksi demi abstraksi". Apakah saya melewatkan sesuatu? Apa keuntungan dunia nyata yang saya dapatkan dari menggunakan Antarmuka baru ini selain mungkin menghemat satu baris kode?
Cara lama (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Cara Baru (WebApi2):
public IHttpActionResult Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
//return new HttpResponseMessage(HttpStatusCode.OK);
return Ok();
}
else
{
//throw new HttpResponseException(HttpStatusCode.NotFound);
return NotFound();
}
}
c#
asp.net-web-api
httpresponse
Jason Roell
sumber
sumber
HttpResponseMessage
saya mendapat respons kembali di 9545 ms . * MenggunakanIHttpActionResult
I mendapat respons yang sama kembali dalam 294 ms .Jawaban:
Anda mungkin memutuskan untuk tidak menggunakan
IHttpActionResult
karena kode Anda yang ada membuat kodeHttpResponseMessage
yang tidak cocok dengan salah satu dari tanggapan kalengan. Namun Anda dapat beradaptasiHttpResponseMessage
denganIHttpActionResult
menggunakan respons kalenganResponseMessage
. Butuh beberapa saat untuk memikirkan ini, jadi saya ingin mempostingnya yang menunjukkan bahwa Anda tidak harus memilih satu atau yang lain:Catatan,
ResponseMessage
adalah metode kelas dasarApiController
yang harus diwarisi oleh pengontrol Anda.sumber
ResponseMessage
danResponseMessageResult
dua hal berbeda.ResponseMessage()
adalah metode dariApiController
yang kontroler Anda harus mewarisi dari, dan karena itu hanya panggilan metode. Jadi tidak adanew
kata kunci yang diperlukan di sana. Anda mungkin tidak mewarisi dariApiController
atau Anda berada di dalam metode statis.ResponseMessageResult
adalah tipe pengembalianResponseMessage()
.response = base.ResponseMessage(responseMsg)
untuk membuatnya lebih jelas bahwa itu adalah metode yang ApiController kelas dasarAnda masih bisa menggunakan
HttpResponseMessage
. Kemampuan itu tidak akan hilang. Saya merasakan hal yang sama seperti Anda dan berdebat secara luas dengan tim bahwa tidak ada kebutuhan untuk abstraksi tambahan. Ada beberapa argumen yang dilontarkan untuk mencoba dan membenarkan keberadaannya tetapi tidak ada yang meyakinkan saya bahwa itu berharga.Begitulah, sampai saya melihat sampel ini dari Brad Wilson . Jika Anda membangun
IHttpActionResult
kelas dengan cara yang bisa dirantai, Anda memperoleh kemampuan untuk membuat pipa respons "tingkat tindakan" untuk menghasilkanHttpResponseMessage
. Di bawah selimut, ini adalah bagaimanaActionFilters
diimplementasikan Namun, pemesanan merekaActionFilters
tidak jelas ketika membaca metode tindakan yang merupakan salah satu alasan saya bukan penggemar filter tindakan.Namun, dengan membuat sesuatu
IHttpActionResult
yang secara eksplisit dapat dirantai dalam metode tindakan Anda, Anda dapat menyusun semua jenis perilaku yang berbeda untuk menghasilkan respons Anda.sumber
Berikut adalah beberapa manfaat dari
IHttpActionResult
lebihHttpResponseMessage
disebutkan dalam Dokumentasi Microsoft ASP.Net :Tetapi di sini ada beberapa keuntungan lain menggunakan
IHttpActionResult
layak disebut:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( tautan ke daftar lengkap )ExecuteAsync
metode.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
untuk mengonversi HttpResponseMessage ke IHttpActionResult .sumber
sumber
Ini hanya pendapat pribadi saya dan orang-orang dari tim API web mungkin dapat mengartikulasikannya dengan lebih baik tetapi ini adalah 2c saya.
Pertama-tama, saya pikir ini bukan pertanyaan satu sama lain. Anda dapat menggunakan keduanya tergantung pada apa yang ingin Anda lakukan dalam metode aksi Anda, tetapi untuk memahami kekuatan sesungguhnya dari
IHttpActionResult
, Anda mungkin akan perlu langkah di luar metode-metode penolong nyamanApiController
sepertiOk
,NotFound
, dllPada dasarnya, saya pikir kelas menerapkan
IHttpActionResult
sebagai pabrikHttpResponseMessage
. Dengan pola pikir itu, sekarang menjadi objek yang perlu dikembalikan dan pabrik yang memproduksinya. Dalam pengertian pemrograman umum, Anda dapat membuat objek sendiri dalam kasus-kasus tertentu dan dalam kasus-kasus tertentu, Anda memerlukan pabrik untuk melakukan itu. Sama disini.Jika Anda ingin mengembalikan respons yang perlu dibangun melalui logika yang kompleks, katakan banyak header respons, dll, Anda dapat mengabstraksi semua logika tersebut menjadi kelas hasil tindakan yang diterapkan
IHttpActionResult
dan menggunakannya dalam berbagai metode tindakan untuk mengembalikan respons.Keuntungan lain menggunakan
IHttpActionResult
sebagai tipe pengembalian adalah membuat metode tindakan ASP.NET Web API mirip dengan MVC. Anda dapat mengembalikan hasil tindakan apa pun tanpa terjebak dalam pembuat format media.Tentu saja, seperti dicatat oleh Darrel, Anda dapat mengaitkan hasil tindakan dan membuat pipa mikro yang kuat mirip dengan penangan pesan sendiri di pipa API. Ini akan Anda butuhkan tergantung pada kompleksitas metode tindakan Anda.
Singkat cerita - tidak
IHttpActionResult
berbanding terbalikHttpResponseMessage
. Pada dasarnya, ini adalah bagaimana Anda ingin membuat respons. Lakukan sendiri atau melalui pabrik.sumber
ResponseFactory.CreateOkResponse()
itu mengembalikan HttpResponseMessage, dan saya tidak harus berurusan dengan hal-hal async saat membuat respons. Satu anggota tim memang menyebutkan fakta bahwa async dapat berguna jika Anda perlu melakukan I / O untuk menghasilkan nilai header. Tidak yakin seberapa sering itu terjadi.Web API pada dasarnya kembali 4 jenis objek:
void
,HttpResponseMessage
,IHttpActionResult
, dan jenis kuat lainnya. Versi pertama dari API Web kembaliHttpResponseMessage
yang cukup lurus ke depan pesan respon HTTP.Itu
IHttpActionResult
diperkenalkan oleh WebAPI 2 yang merupakan semacam bungkusHttpResponseMessage
. Ini berisiExecuteAsync()
metode untuk membuatHttpResponseMessage
. Ini menyederhanakan pengujian unit controller Anda.Jenis pengembalian lainnya adalah jenis kelas mengetik yang kuat yang diserialisasi oleh API Web menggunakan formatter media ke dalam badan respons. Kekurangannya adalah Anda tidak dapat langsung mengembalikan kode kesalahan seperti 404. Yang dapat Anda lakukan hanyalah melempar
HttpResponseException
kesalahan.sumber
Saya lebih suka mengimplementasikan fungsi antarmuka TaskExecuteAsync untuk IHttpActionResult. Sesuatu seperti:
, di mana _request adalah HttpRequest dan _respContent adalah payload.
sumber
Kami memiliki manfaat menggunakan
IHttpActionResult
lebih dariHttpResponseMessage
:IHttpActionResult
kami hanya berkonsentrasi pada data yang akan dikirim bukan pada kode status. Jadi di sini kodenya akan lebih bersih dan sangat mudah dirawat.async
danawait
secara default.sumber