以RESTful方式从WCF服务返回错误的最佳方法是什么?

时间:2009-01-06 18:28:28

标签: wcf web-services error-handling rest

以RESTful方式使用WCF似乎很棒。我很喜欢简单和灵活的大枪,但我也喜欢Urls最终看的方式。我能说什么,我是程序员。

用于检索和编辑资源的简单API与几乎同样简单的一组可能的错误响应相匹配,我不禁感到要保持“纯粹的”RESTful方法,我可能会嗤之以鼻通过面部,或者更具体地说,我的网络服务消费者的鼻子。我可能是错的,但似乎没有很多我可以使用的Http错误代码,也没有办法传回自定义错误信息。

澄清一下,我说的是正确的例外错误而不是预期的错误。我想实际向用户传达一个问题,以帮助他们确定需要做些什么来纠正它。

我正在考虑的可能选择......

  1. 只需使用Http错误代码 - 这似乎对我能够表达的内容过于严格,并且不允许我提供自定义消息。如果我错了,请(!)纠正我。

  2. 始终返回Http Success但返回自定义错误对象 - 显然最灵活,但肯定不是最RESTful。

  3. 如果有人能分享这个特定问题的真实世界经验,我将非常感激。


    更新

    感谢您建议使用StatusDescription对象的OutgoingWebResponseContext属性。起初似乎是我可以使用的东西。

    我得出结论,我上面的第二个选项不适合我。我想坚持Http给我的东西。

    然而,

    我遇到了问题。无论我为此属性提供什么值,它都不会在响应中返回。

    我的服务方法如下所示

    public MyType GetMyTypes(string criteria)
    {
        try
        {
            return GetMyTypes();
        }
        catch (Exception ex)
        {
            OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
            response.StatusCode = HttpStatusCode.Forbidden;
            response.StatusDescription = "A Big fat error occurred";
            return null;
        }
    }
    

    这是原始响应消息。没有提到自定义消息...

      

    HTTP / 1.1 403禁止
      服务器:ASP.NET Development Server / 9.0.0.0
      日期:2009年1月7日星期三格林尼治标准时间14:01:20   X-AspNet-Version:2.0.50727
      缓存控制:私人
      内容长度:0
      连接:关闭

    这不像我只需要访问客户端上的正确属性。信息根本不是通过链接发送的。

    这个StatusDescription属性实际上做了什么?


    更新

    我从未弄清楚如何设置StatusDescription属性。我最终没有包含任何错误消息,只使用Http状态代码。我选择为我的服务公开Soap和Restful端点,因此客户可以选择他们喜欢使用哪些 - 简单的Restful消息或相对更丰富的Soap消息。

5 个答案:

答案 0 :(得分:21)

使用.net 4,抛出WebFaultException<T> (T errorDetail, HttpResponseCode code)

在这里,您可以将响应类型设置为另一种对象类型,这是有意义的,并且您还可以设置所需的ResponseCode

errorDetail必须是可序列化的

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

答案 1 :(得分:8)

发送正确的响应代码,您可以在响应正文中提供自定义错误消息。

答案 2 :(得分:5)

我将以上(在状态描述中)和REST服务中返回页面正文中的错误代码添加为:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

答案 3 :(得分:2)

有关类似问题,请参阅this thread

简而言之,我相信您可以设置HTTP状态代码(到其中一个错误代码),并在StatusDescription属性中提供自定义消息:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

不幸的是,我不太了解这种技术在现实世界中的流行程度。

答案 4 :(得分:0)