Saya mencoba mengembalikan kode status 304 yang tidak dimodifikasi untuk metode GET di pengontrol api web.
Satu-satunya cara saya berhasil adalah sesuatu seperti ini:
public class TryController : ApiController
{
public User GetUser(int userId, DateTime lastModifiedAtClient)
{
var user = new DataEntities().Users.First(p => p.Id == userId);
if (user.LastModified <= lastModifiedAtClient)
{
throw new HttpResponseException(HttpStatusCode.NotModified);
}
return user;
}
}
Masalahnya di sini adalah itu bukan pengecualian, hanya saja tidak dimodifikasi sehingga cache klien OK. Saya juga ingin jenis kembali menjadi Pengguna (karena semua contoh api web menunjukkan dengan GET) tidak mengembalikan HttpResponseMessage atau sesuatu seperti ini.
beta
atau membangun malam ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Apakah itu tidak berhasil?Jawaban:
Saya tidak tahu jawabannya jadi bertanya pada tim ASP.NET di sini .
Jadi triknya adalah mengubah tanda tangan
HttpResponseMessage
dan menggunakannyaRequest.CreateResponse
.sumber
GetUser(request, id, lastModified).TryGetContentValue(out user)
, di manauser
(dalam contoh kasus) adalahUser
objek.IHttpActionResult
dan Anda ingin mengembalikan Pengguna, Anda bisa melakukannyareturn Ok(user)
. Jika Anda perlu mengembalikan kode status lain (katakanlah, dilarang), Anda bisa melakukannyareturn this.StatusCode(HttpStatusCode.Forbidden)
.Anda juga dapat melakukan hal berikut jika Anda ingin mempertahankan tanda tangan tindakan sebagai Pengguna yang kembali:
Jika Anda ingin mengembalikan sesuatu selain dari
200
itu Anda melemparkanHttpResponseException
dalam tindakan Anda dan meneruskanHttpResponseMessage
Anda ingin mengirim ke klien.sumber
NotModified
benar-benar boros. Jika semua API Anda melakukan ini, maka server Anda sebagian besar akan mengkonversi watt menjadi pengecualian.Di MVC 5, segalanya menjadi lebih mudah:
sumber
Ubah metode GetXxx API untuk mengembalikan HttpResponseMessage dan kemudian mengembalikan versi yang diketik untuk respons penuh dan versi yang tidak diketik untuk respons NotModified.
* Data ClientHasStale adalah ekstensi saya untuk memeriksa header ETag dan IfModifiedSince.
Kerangka MVC masih harus bersambung dan mengembalikan objek Anda.
CATATAN
Saya pikir versi generik sedang dihapus di beberapa versi Web API di masa depan.
sumber
Saya benci menabrak artikel lama tapi ini adalah hasil pertama untuk ini dalam pencarian google dan saya bersenang-senang dengan masalah ini (bahkan dengan dukungan kalian). Jadi begini ...
Semoga solusi saya akan membantu mereka yang juga bingung.
dan kemudian hanya mewarisi dari BaseController
dan kemudian menggunakannya
sumber
.net core 2.2 mengembalikan 304 kode status. Ini menggunakan ApiController.
Secara opsional, Anda dapat mengembalikan objek dengan respons
sumber
Untuk ASP.NET Web Api 2, posting ini dari MS menyarankan untuk mengubah tipe pengembalian metode menjadi
IHttpActionResult
. Anda kemudian dapat kembali dibangun diIHttpActionResult
implementasi sepertiOk
,BadRequest
, dll ( lihat di sini ) atau kembali implementasi sendiri.Untuk kode Anda, itu bisa dilakukan seperti:
sumber
Pilihan lain:
sumber
sumber
Jika Anda perlu mengembalikan IHttpActionResult dan ingin mengembalikan kode kesalahan plus pesan, gunakan:
sumber
Saya tidak suka harus mengubah tanda tangan saya untuk menggunakan tipe HttpCreateResponse, jadi saya datang dengan sedikit solusi tambahan untuk menyembunyikannya.
Anda kemudian dapat menambahkan metode ke ApiController Anda (atau lebih baik pengendali basis Anda) seperti ini:
Kemudian Anda dapat mengembalikannya sama seperti metode bawaan apa pun:
sumber
Pembaruan untuk jawaban @Aliostads menggunakan lebih banyak moden yang
IHttpActionResult
diperkenalkan di Web API 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
sumber
Coba ini :
sumber