Захватите ответ, когда служба возвращает ошибку 500, используя WCF - PullRequest
2 голосов
/ 14 июня 2011

Я получаю данные от стороннего веб-сервиса, используя REST (используя WebHttpBinding и WebHttpBehavior). Когда я передаю недопустимый параметр в строке запроса, служба отвечает статусом 500 и описывает проблему. Ответ выглядит примерно так:

HTTP/1.1 500 Internal Server Error
Date: Tue, 14 Jun 2011 16:12:48 GMT
... more headers

<Error>Invalid integer value for ID</Error>

Я бы очень хотел иметь возможность записать это сообщение об ошибке. Мой клиент WCF выглядит так:

public class DataClient : ClientBase<IDataClient>, IDataClient
{
    public DataClient (string endpointAddress)
        : base(new WebHttpBinding(), new EndpointAddress(endpointAddress))
    {
        this.Endpoint.Behaviors.Add(new WebHttpBehavior());
    }

    public string GetData(string id)
    {
        // This is where the exception is thrown
        return base.Channel.GetData(id);
    }
}

Когда я ловлю выбрасываемое исключение, эти данные нигде не найти. Он просто говорит: «System.ServiceModel.CommunicationException: внутренняя ошибка сервера».

Я попытался создать пользовательское поведение и добавил инспектор сообщений, но мой код инспектора пользовательских сообщений не выполняется до того, как сгенерировано исключение (оно выполняется, если не сгенерировано исключение).

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Я наконец понял это. Создание собственного поведения и добавление инспектора сообщений - это то, что мне нужно для этого. Мне просто нужно было добавить свое пользовательское поведение перед WebHttpBehavior. Затем я могу просмотреть весь ответ и выдать свое собственное исключение со всеми данными в нем!

0 голосов
/ 14 июня 2011

(Не удается заставить мой тестовый проект фактически отправлять HTTP 500, кажется, что он делает это только тогда, когда я этого не хочу; -)

В случае, если это поможет вам, попробуйте заключить вызов службы поддержки клиента и осмотрите response в отладчике, чтобы увидеть, содержит ли он строку ошибки, которую вы пытаетесь перехватить.

    using (new OperationContextScope(service1.InnerChannel))
    {
        try
        {
            result = service1.GetData("5");
        }
        catch (System.Exception e)
        {
            string msg = e.ToString();
        }
        HttpResponseMessageProperty response = (HttpResponseMessageProperty)
            OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...