是否建议使用Web服务在所请求的对象中保留错误消息?
在某些示例中,我看到webservices返回包含一些HTTP错误代码的包装类,其他包含.NET异常的消息。另一方面,有一些示例返回普通对象或对象列表。
答案 0 :(得分:4)
错误处理最初可能会让人感到困惑。 official documentation is here。Full definition here。但实质上,ServiceStack尝试以一致的方式返回错误,因此您的客户端始终知道如何处理它们。您应该以正常的c#方式抛出异常,ServiceStack将捕获这些异常并将其封装在ResponseStatus
对象中,如下所示:
public class ResponseStatus
{
public string ErrorCode { get; set; }
public string Message { get; set; }
public string StackTrace { get; set; }
public List<ResponseError> Errors { get; set; }
}
validation in the documentation
因此,您将收到一个响应对象,其中包含一个名为ResponseStatus
的属性,其中包含上面填充的ResponseStatus
对象。
注意事项:
只有在ServiceStack AppHost配置中启用StackTrace
模式时,才会包含debug
属性。即:
SetConfig(new HostConfig { DebugMode = true });
这将是您所指的.NET例外,并且会有条件地显示,如果设置了DebugMode
。
Errors
ResponseError
列表仅填充验证错误失败。这将是验证错误列表。这就是为什么你在一些例子中看到一个简单的错误响应(即不是验证错误),以及附有错误列表的响应(验证错误)。您还应该阅读有关{{3}}的部分。 ResponseError
对象的格式为:
public class ResponseError
{
public string ErrorCode { get; set; }
public string FieldName { get; set; }
public string Message { get; set; }
}
ErrorCode
对象的Message
和ResponseStatus
将从Errors
列表的第一项中获取。
如果某些人感到困惑,那么将ResponseStatus
作为预期回复请求的属性包括在内。
假设您想要返回一个Person
对象,例如:
class Person
{
string FirstName { get; set; }
string LastName { get; set; }
}
如果针对返回此Person
响应的请求抛出了验证异常,您可能会得到如下的JSON响应:
{
"ResponseStatus": {
"ErrorCode": "ShouldNotBeEmpty",
"Message": "'FirstName' should not be empty",
"StackTrace": "..."
"Errors": [
{
"ErrorCode": "ShouldNotBeEmpty",
"FieldName": "FirstName",
"Message": "'FirstName' should not be empty"
},
{
"ErrorCode": "ShouldNotBeEmpty",
"FieldName": "LastName",
"Message": "'LastName' should not be empty"
},
]
}
}
请注意,Person的响应对象不包含在此响应中,只是包含ResponseStatus
属性的对象。如果我们想要包含具有状态的响应对象,我们必须以这种方式声明我们的person类:
class PersonResponse
{
ResponseStatus ResponseStatus { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
}
然后,当抛出异常时,响应将包括响应对象及其状态:
{
"FirstName": "",
"LastName": "",
"ResponseStatus": {
...
ServiceStack为您提供了对抛出异常时返回的错误格式的大量控制,您最好通读我上面链接的官方文档来理解它。定制更像是一个高级主题。