Pertanyaan Apa cara terbaik untuk mengembalikan kesalahan dari layanan WCF dengan cara RESTful?


Menggunakan WCF dengan cara RESTful sepertinya bagus. Saya penggemar berat senjata besar seperti kesederhanaan dan fleksibilitas, tetapi saya juga suka cara Urls akhirnya mencari. Apa yang bisa saya katakan, saya seorang programmer.

API sederhana untuk mengambil dan mengedit sumber daya dicocokkan dengan sekumpulan respons kesalahan yang hampir sama sederhananya, dan saya tidak bisa menahan perasaan bahwa untuk tetap menggunakan pendekatan "murni" Tenang, saya mungkin akan memotong hidung saya karena dengung, atau lebih spesifik, hidung konsumen layanan web saya. Saya bisa saja salah, tetapi tampaknya tidak terlalu banyak kode kesalahan Http yang dapat saya gunakan, dan tidak ada cara untuk meneruskan pesan kesalahan khusus.

Untuk memperjelas, saya berbicara tentang kesalahan luar biasa yang tepat dan tidak kesalahan yang diharapkan. Saya ingin benar-benar mengkomunikasikan masalah kepada pengguna untuk membantu mereka mengidentifikasi apa yang perlu mereka lakukan untuk memperbaikinya.

Pilihan yang mungkin saya pertimbangkan ...

  1. Cukup gunakan kode kesalahan Http - Sepertinya ini terlalu mengekang pada apa yang bisa saya ekspresikan, dan tidak akan mengizinkan saya untuk memberikan pesan khusus. Mohon koreksi saya jika saya salah.

  2. Selalu kembalikan Sukses Http tetapi kembalikan objek kesalahan kustom - Jelas yang paling fleksibel tetapi tentu bukan yang paling tenang.

Saya akan sangat menghargai jika ada yang bisa berbagi pengalaman dunia nyata dari masalah khusus ini.


Memperbarui

Terima kasih atas saran menggunakan StatusDescription milik dari OutgoingWebResponseContext obyek. Tampaknya pada awalnya menjadi sesuatu yang bisa saya gunakan.

Saya telah sampai pada kesimpulan bahwa pilihan kedua saya di atas bukan untuk saya. Saya ingin tetap pada apa yang Http dapat berikan kepada saya.

Namun, saya mengalami kesulitan untuk membuatnya berfungsi. Terlepas dari nilai yang saya berikan untuk properti ini, itu tidak akan dikembalikan dalam respons.

Metode layanan saya terlihat seperti ini

public MyType GetMyTypes(string criteria)
{
    try
    {
        return GetMyTypes();
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Forbidden;
        response.StatusDescription = "A Big fat error occurred";
        return null;
    }
}

Dan inilah pesan tanggapan mentah. Tidak disebutkan tentang pesan khusus ...

HTTP / 1.1 403 Forbidden
  Server: ASP.NET Development Server / 9.0.0.0
  Tanggal: Rabu, 07 Januari 2009 14:01:20 GMT
  X-AspNet-Versi: 2.0.50727
  Cache-Control: pribadi
  Panjang Konten: 0
  Koneksi: Tutup

Bukannya saya hanya perlu mengakses properti yang benar pada klien. Informasi tersebut tidak dikirim melalui tautan.

Apa ini? StatusDescription properti sebenarnya?


Memperbarui

Saya tidak pernah menemukan cara mengatur properti StatusDescription. Saya akhirnya tidak menyertakan pesan kesalahan sama sekali, dan hanya akan menggunakan kode status Http. Saya telah memilih untuk mengekspos Sabun dan titik akhir yang tenang untuk layanan saya, sehingga klien dapat memilih mana yang lebih mereka sukai - pesan Istirahat yang sederhana atau pesan Sabun yang relatif lebih kaya.


32
2018-01-06 18:28


asal


Jawaban:


Kirim kode respon yang tepat dan Anda dapat memberikan pesan kesalahan kustom di tubuh respons.


8
2018-01-06 18:31



Dengan .net 4, lempar a WebFaultException<T>(T errorDetail,  HttpResponseCodecode)

Di sini Anda mengatur jenis respons Anda ke tipe objek lain, yang masuk akal, dan juga Anda mengatur ResponseCodeitu yang kamu mau.

Itu errorDetail harus bisa diserialisasi

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx


20
2017-12-30 19:10



Saya menambahkan kode kesalahan baik seperti di atas (dalam deskripsi status) dan di badan halaman yang dikembalikan dalam layanan SISA saya sebagai:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

5
2018-04-16 17:42



Lihat utas ini untuk pertanyaan serupa.

Singkatnya, saya yakin Anda dapat mengatur kode status HTTP (ke salah satu kode kesalahan), dan memberikan pesan kustom Anda di StatusDescription milik:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

Saya tidak tahu banyak tentang prevalensi teknik ini di dunia nyata sayangnya.


2
2018-01-06 18:42



Ini mungkin cacat. Mulai 9/22/2011, masalah sedang ditinjau oleh tim produk:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response


0
2017-11-11 18:41