Как вернуть ошибки в JSON из службы WCF с поддержкой AJAX? - PullRequest
1 голос
/ 24 июля 2011

У меня есть служба WCF с поддержкой AJAX (с включенной функцией enableWebScript), которая имеет созданную мной ошибку ValidationFault.

Вот услуга:

[ServiceContract]
public interface ICoreWCF
{
    /// <summary>
    /// Saves the Customer.
    /// </summary>
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    [FaultContract(typeof(ValidationFault))]
    void Customer_Save(Customer customer);
}

Вот вина:

[DataContract]
public class ValidationFault
{
    [DataMember(Name = "success")]
    public bool Success { get; set; }

    [DataMember(Name = "msg")]
    public string ValidationMessage { get; set; }

    [DataMember(Name = "errors")]
    public Dictionary<string, string> Errors { get; set; }
}

Я хотел бы отправить эту ошибку обратно клиентскому javascript. Проблема в том, что DataMembers моей пользовательской ошибки игнорируются, и возвращается общее исключение.

Как отправить клиенту коллекцию ошибок?

Я уже пытался написать свой собственный IErrorHandler , аналогичный this , так что он использует блок приложения обработки исключений для преобразования исключения в ошибку, а затем IErrorHandler сериализует возникающую ошибку , Но похоже, что JsonErrorHandler из WebScriptingEnablingBehavior плохо справляется с результирующим объектом Message.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Если вы внедрили IErrorHandler и связали его с сервисом, используя пользовательское поведение, унаследованное от WebHttpBehavior, как видно по ссылке, то, возможно, вам следует попробовать добавить формат запроса / ответа по умолчанию и т. Д. Например,

private class CustomWebScriptBehavior : WebHttpBehavior
{
    protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
        System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        // clear current error handlers
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
        // add our error handler
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
                new ErrorHandler(true));
    }

    private WebMessageFormat _requestFormat;
    private WebMessageFormat _responseFormat;

    public CustomWebScriptBehavior()
    {
        _requestFormat = _responseFormat = WebMessageFormat.Json;
    }

    public override bool AutomaticFormatSelectionEnabled
    {
        get { return false; }
        set { throw new NotSupportedException(); }
    }

    public override WebMessageBodyStyle DefaultBodyStyle
    {
        get { return WebMessageBodyStyle.WrappedRequest; }
        set { throw new NotSupportedException(); }
    }

    public override WebMessageFormat DefaultOutgoingRequestFormat
    {
        get { return _requestFormat; } 
        set { _requestFormat = value; }
    }

    public override WebMessageFormat DefaultOutgoingResponseFormat
    {
        get { return _responseFormat; }
        set { _responseFormat = value; }
    }
}

Это избавит от необходимости указывать атрибут WebInvoke для каждого метода.

0 голосов
/ 25 июля 2011

в webinvoke вы можете добавить RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json попробуйте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...