2009-05-08 4 views
1

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

Вот пример моей работы контракта:

[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, который я ожидаю, там?

ответ

3

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

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

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

Марк

+0

Спасибо Marc. Чтобы добавить оскорбление к травме, я думаю, что API REST, который я вызываю, фактически возвращает 200/OK, даже если есть ошибка, и только дает мне сообщение об ошибке в HTML. Мне нужно связаться с ними для получения дополнительной информации. –

2

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

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

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

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

+0

Привет, Даррел. В этом случае у меня нет никакого контроля над сервером - это сторонний веб-сайт. Спасибо за ваш ответ. +1 –

Смежные вопросы