【问题标题】:What is the best way to return errors from a WCF service in a RESTful way?以 RESTful 方式从 WCF 服务返回错误的最佳方式是什么?
【发布时间】:2009-01-06 18:28:28
【问题描述】:

以 RESTful 方式使用 WCF 似乎很棒。我是大枪的忠实粉丝,比如简单性和灵活性,但我也喜欢 Urls 最终的外观。怎么说呢,我是程序员。

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

为了澄清,我说的是适当的异常错误,而不是预期的错误。我想将问题实际传达给用户,以帮助他们确定需要做些什么来纠正它。

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

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

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

如果有人能分享一些关于这个特定问题的真实经验,我将不胜感激。


更新

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

我得出的结论是,上面的第二个选项不适合我。我想坚持 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 开发服务器/9.0.0.0
日期:格林威治标准时间 2009 年 1 月 7 日,星期三 14:01:20
X-AspNet-版本:2.0.50727
缓存控制:私有
内容长度:0
连接:关闭

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

StatusDescription 属性实际上是做什么的?


更新

我从来不知道如何设置 StatusDescription 属性。我最终根本没有包含任何错误消息,只使用了 Http 状态代码。我选择为我的服务公开 Soap 和 Restful 端点,因此客户可以选择他们喜欢使用的端点——简单的 Restful 消息或相对丰富的 Soap 消息。

【问题讨论】:

标签: wcf web-services error-handling rest


【解决方案1】:

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

在这里您将响应类型设置为另一个对象类型,这很有意义,并且您还设置了您想要的ResponseCode

errorDetail 必须是可序列化的

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

【讨论】:

  • 对我来说,这只会导致客户端获得“主机强制关闭连接”
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我将上述错误代码(在状态描述中)和我的 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;
    

    【讨论】:

    • 感谢您的回复。我永远无法让 StatusDescription 属性真正做任何事情。我想我可能做错了什么。最后我选择了使用基本的状态码。我们还在 Soap 端点公开服务,它们返回更有意义的消息。我们的客户可以选择。
    • 顺便说一句,如果您将代码的每一行缩进 4 个空格,则格式正确。
    • 如果您使用的是纯 WCF,这将不起作用,HttpContext.Current 是一个 asp.net 构造。要在 WCF 中执行此操作,fault = WebOperationContext.Current.CreateTextResponse("You are not authorized")。
    【解决方案4】:

    请参阅this thread 了解类似问题。

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

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

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

    【讨论】:

      【解决方案5】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-03
        • 2011-10-18
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多