Служба WCF возвращает ошибки в формате JSON - PullRequest
5 голосов
/ 14 июля 2010

Можно ли получить службу WCF для возврата «ошибки» клиенту? Я уверен, что это возможно при использовании SOAP, но я хотел бы вернуть JSON.

В идеале код ответа HTTP должен быть установлен на что-то, указывающее, что произошла ошибка, и тогда подробности проблемы будут доступны в ответе JSON.

В настоящее время я делаю что-то вроде этого:

[ServiceContract]
public class MyService
{
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    [FaultContract(typeof(TestFault))]
    public MyResult MyMethod()
    {
        throw new FaultException<TestFault>(new TestFault("Message..."), "Reason...");
    }
}

Где TestFault выглядит так:

[DataContract]
public class TestFault
{
    public TestFault(string message)
    {
        this.Message = message;
    }

    [DataMember]
    public string Message { get; set; }
}

В данный момент в настройке сервиса нет ничего особенного.

В результате получается ответ «400 Bad Request» с ошибкой в ​​формате HTML. (Когда я includeExceptionDetailInFaults, я вижу «Причину ...» и подробности FaultException, но нет подробностей о TestFault.)

Веб-служба возвращает JSON в порядке, если Exception (или FaultException) не выбрасывается.

Любые предложения ..?

Ответы [ 3 ]

13 голосов
/ 14 июля 2010

Все, что вам нужно, возможно, начиная с .NET 4. Подробнее см. здесь . Например:

throw new WebFaultException<string>(
    "My error description.", HttpStatusCode.BadRequest); 
7 голосов
/ 14 июля 2010

Редактировать: исправлена ​​ссылка + добавлена ​​сводка.

Здесь вы можете найти объяснение и решение

Чтобы суммировать решение по ссылке, расширьте WebHttpBehavior и переопределитеAddServerErrorHandlers для добавления вашей собственной реализации IErrorHandler.Эта реализация извлечет ошибку из сервисного вызова и сгенерирует информацию об ошибке.

В связанной статье также показано, как написать собственную фабрику хостов служб, которая настраивает это поведение.

1 голос
/ 28 марта 2014

Ошибка обратного вызова вашего вызова jQuery.ajax () должна выглядеть следующим образом:

error: function (xhr, status, error) {
  var responseObj = JSON.parse(xhr.responseText);
  alert('Request failed with error: "' + responseObj.Message);
}

В вашей службе WCF передайте исключение в конструктор WebFaultException. Ваше пользовательское сообщение будет доступно через responseObj.Message в приведенном выше JavaScript:

public class AJAXService : IAJAXService
{
  public void SomeMethod()
  {
    throw new WebFaultException<Exception>(new Exception("some custom error message!"), HttpStatusCode.InternalServerError);
  }
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...