当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《以RESTful方式从WCF服务返回错误的最佳方法是什么?》经验,为你挑选了3个好方法。

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

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

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

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

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

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

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


更新

感谢您使用对象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开发服务器/9.0.0.0日期
:Wed,07 Jan 2009 14:01:20 GMT
X-AspNet-Version:2.0.50727
Cache-Control:private
Content-Length:0
Connection:关

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

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


更新

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



1> Guillermo Ru..:

使用.net 4,抛出一个 WebFaultException(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> Hank Gay..:

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



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;

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有