使用ServiceStack处理错误消息

时间:2014-02-16 00:22:10

标签: c# web-services servicestack

是否建议使用Web服务在所请求的对象中保留错误消息?

在某些示例中,我看到webservices返回包含一些HTTP错误代码的包装类,其他包含.NET异常的消息。另一方面,有一些示例返回普通对象或对象列表。

1 个答案:

答案 0 :(得分:4)

错误处理最初可能会让人感到困惑。 official documentation is hereFull 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对象的MessageResponseStatus将从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为您提供了对抛出异常时返回的错误格式的大量控制,您最好通读我上面链接的官方文档来理解它。定制更像是一个高级主题。