Как отлавливать ошибки HTTP при использовании атрибута WCG WebGet? - PullRequest
1 голос
/ 08 мая 2009

Я использую атрибут [WebGet] для запроса REST API на веб-сервере. Время от времени (поскольку API все еще находится в стадии разработки) я получаю документ HTML в виде ошибки HTTP / 500 вместо XML, который я хочу.

Вот пример моего операционного контракта:

[WebGet(UriTemplate = "search/?api_key={key}&query={query}",
   BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
XElement Find(string key, string query);

... и вот как я это называю:

var factory = new WebChannelFactory<IFooFinder>(
    new Uri("http://api.example.com"));
var channel = factory.CreateChannel();
var results = channel.Find(myApiKey, "foo");

В случае ошибки «результаты» в конечном итоге становятся XElement, который содержит этот XML:

<html>
    <head></head>
    <body>
        500 Internal Server Error
    </body>
</html>

Есть ли какой-нибудь способ перехватить ошибку 500 до того, как XML-файл будет возвращен, и канал выдаст исключение или что-то в этом роде? Или мне придется каждый раз проверять переменную результатов, чтобы убедиться, что там есть ожидаемый XML?

Ответы [ 2 ]

3 голосов
/ 08 мая 2009

Нет, вы не можете вызвать исключение или ошибку SOAP, поскольку все, что у вас есть, - это HTTP. Таким образом, если ваша служба перестает работать, единственный способ сообщить об этом клиенту HTTP - через код состояния HTTP.

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

Но основной механизм таков: вы используете HTTP только для GET, у вас есть только HTTP для возврата кодов состояния и ошибок.

Марк

2 голосов
/ 08 мая 2009

Если вы установите код состояния на сервере в код ошибки, то я ожидаю, что клиент отобразит это в исключение. Я знаю, что System.Net.HttpWebRequest создает исключение WebException на клиенте, если он получает код состояния серии 400 или 500.

На стороне сервера, если вы не хотите добавлять блоки try catch в каждом методе реализации службы, вам придется заменить стандартный обработчик ошибок, предоставляемый System.ServiceModel.Web.

У меня есть код, который делает это, создавая новый производный WebHttpBehaviour и перегружая AddServerErrorHandlers, чтобы предотвратить применение обработчика ошибок по умолчанию. Затем вам нужно добавить свой обработчик ошибок, который будет устанавливать код состояния с помощью ApplyDispatchBehavior в новом поведении, которое реализует IServiceBehavior.

Возможно, есть более простой способ. Кажется, в WCF есть 1001 способ убить одного и того же кота.

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