使用WCF的WebGet属性时如何捕获HTTP错误?

时间:2009-05-08 04:56:08

标签: .net wcf http rest

我正在使用[WebGet]属性来查询Web服务器上的REST API。每隔一段时间(因为API仍在开发中)我会以HTTP / 500错误的形式返回HTML文档,而不是我想要的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");

如果发生错误,“结果”最终成为包含此XML的XElement:

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

有没有办法在返回XML之前捕获500错误,并让频道抛出异常或其他什么?或者我每次都必须检查结果变量以确保我期望的XML在那里?

2 个答案:

答案 0 :(得分:3)

不,你不能真正抛出异常或SOAP错误,因为你真的只有HTTP。因此,如果您的服务失败,它可以通过HTTP状态代码与HTTP客户端进行通信的唯一方式。

您可以尝试使代码更有意义,例如不要总是返回500但将其拆分为更多细节,或者您可能包含更多描述性错误消息(至少用于开发和测试)以提示您出现了什么问题。

但基本机制是:您只使用HTTP进行GET,只有HTTP才能返回状态和错误代码。

马克

答案 1 :(得分:2)

如果您将服务器上的状态代码设置为错误代码,那么我希望客户端将其映射到异常。我知道System.Net.HttpWebRequest如果获得400或500系列状态代码,则会在客户端上抛出WebException。

在服务器端,如果您不想在每个服务实现方法中添加try catch块,那么您将不得不替换System.ServiceModel.Web提供的标准错误处理程序。

我有通过创建新的派生WebHttpBehaviour并重载AddServerErrorHandlers以防止应用默认错误处理程序来执行此操作的代码。然后,您需要添加错误处理程序,该错误处理程序将通过在实现IServiceBehavior的新行为中使用ApplyDispatchBehavior来设置状态代码。

可能有一种更简单的方法。在WCF中似乎有1001种方法对同一只猫进行换肤。