Jak zrobić niestandardowy moduł obsługi błędów WCF zwróci odpowiedź JSON z nie-OK kodem http?

Implementuję usługę WWW RESTful przy użyciu WCF i WebHttpBinding. Obecnie pracuję nad logiką obsługi błędów, implementując niestandardową obsługę błędów (IErrorHandler); celem jest złapanie wszystkich niezłapanych wyjątków generowanych przez operacje, a następnie zwrócenie obiektu błędu JSON (w tym powiedzenie kodu błędu i komunikatu o błędzie - np. {"errorCode": 123, "errorMessage": "bla"}) z powrotem do użytkownik przeglądarki wraz z kodem HTTP, takim jak BadRequest, InteralServerError lub czymkolwiek (naprawdę nic innego niż „OK”). Oto kod, którego używam wewnątrz metody ProvideFault mojego programu obsługi błędów:

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
var rmp = new HttpResponseMessageProperty();
rmp.StatusCode = System.Net.HttpStatusCode.InternalServerError;
rmp.Headers.Add(HttpRequestHeader.ContentType, "application/json");
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);

-> Zwraca to z Content-Type: application / json, jednak kod statusu to „OK” zamiast „InternalServerError”.

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
var rmp = new HttpResponseMessageProperty();
rmp.StatusCode = System.Net.HttpStatusCode.InternalServerError;
//rmp.Headers.Add(HttpRequestHeader.ContentType, "application/json");
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);

-> Zwraca poprawny kod statusu, jednak typem zawartości jest teraz XML.

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);

var response = WebOperationContext.Current.OutgoingResponse;
response.ContentType = "application/json";
response.StatusCode = HttpStatusCode.InternalServerError;

-> Zwraca poprawny kod statusu i poprawny typ zawartości! Problem polega na tym, że treść http zawiera teraz tekst „Nie można załadować źródła dla:http: // localhost: 7000 / bla.. 'zamiast rzeczywistych danych JSON ..

Jakieś pomysły? Zastanawiam się nad użyciem ostatniego podejścia i po prostu przyklejeniem JSON w polu nagłówka HTTP StatusMessage zamiast w ciele, ale to nie wydaje się tak miłe?

questionAnswers(8)

yourAnswerToTheQuestion