Bagaimana cara mengembalikan kode status HTTP kustom dari metode WCF REST?

88

Jika ada yang salah dalam panggilan REST WCF, seperti sumber daya yang diminta tidak ditemukan, bagaimana saya bisa bermain dengan kode respon HTTP (mengaturnya ke sesuatu seperti HTTP 404, misalnya) dalam metode OperationContract saya?

kgriffs
sumber
ok semua jawaban untuk ini mengasumsikan kontrol berhasil dalam implementasi layanan Anda. bagaimana jika mereka memberikan uri yang sama sekali tidak valid? bagaimana Anda bisa memberikan 404 untuk semua klik tak terduga ke layanan Anda?
Nathan Tregillus

Jawaban:

111

Ada WebOperationContextyang dapat Anda akses dan memiliki OutgoingResponseproperti tipe OutgoingWebResponseContextyang memiliki StatusCodeproperti yang dapat diatur.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
Eric Schoonover
sumber
5
Apakah ini berfungsi di dalam Layanan Data WCF - Operasi Layanan? Saya belum beruntung, sepertinya StatusCode yang saya setel dikalahkan oleh hal lain. Jadi pada semua permintaan HTTP POST, saya mendapatkan kembali 204 terlepas bahwa saya menetapkannya pada 201, dll.
RyBolt
1
Tidak berfungsi dalam kasus saya, status ditimpa. Melempar WebFaultException, bagaimanapun, tampaknya berhasil.
Josh M.
73

Jika Anda perlu mengembalikan badan alasan, lihat WebFaultException

Sebagai contoh

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
Graeme Bradbury
sumber
4
Saya suka ini lebih baik daripada yang diterima karena kami tidak menggunakan WebOperationContext.Current statis
Noel Abrahams
perlu diingat ini hanya berlaku sejak fpirasi 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez
hmm, di .NET 4.5.1 ini bukan pengaturan kode status untuk saya, saya masih mendapatkan 200. Saya menggunakan jsonp, itu memanggil panggilan balik saya (dalam javascript) dan meneruskan pesan saya dan kode status saya sebagai bilangan bulat.
Shavais
4
Ini tampaknya bagus untuk apa pun di luar kode 2XX, tetapi apakah Anda akan melempar WebFaultExceptionuntuk mengembalikan HttpStatusCode.Created?
hancurkan
23

Untuk 404 ada metode bawaan di WebOperationContext.Current.OutgoingResponse yang disebut SetStatusAsNotFound (pesan string) yang akan menyetel kode status ke 404 dan deskripsi status dengan satu panggilan.

Perhatikan juga, SetStatusAsCreated (lokasi Uri) yang akan mengatur kode status ke 201 dan header lokasi dengan satu panggilan.

JarrettV
sumber
Apakah ini lebih disukai daripada metode yang ditampilkan dalam jawaban yang diterima?
hancurkan
2

Jika Anda ingin melihat deskripsi status di header, metode REST harus memastikan untuk mengembalikan null dari bagian Catch () seperti di bawah ini:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}
Hydtechie
sumber
1
Ini juga tidak berhasil untuk saya, saya masih mendapatkan 200. Saya menggunakan WebHttpBinding dengan crossDomainScriptAccessEnabled = "true" dan perilaku titik akhir webHttp dengan gaya tubuh default dibungkus dan format respons keluar default json .. tapi itu tidak masalah, bukan?
Shavais
2

Anda juga dapat mengembalikan statusCode dan alasan tubuh dengan WebOperationContext 's StatusCode dan StatusDescription :

WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";
eitzo
sumber