serialization - ServiceStack异常序列化行为

标签 serialization error-handling servicestack servicestack-text

免责声明:我对 ServiceStack 还很陌生

鉴于以下服务:

public class TestService : Service
{
    public TestResponse Get(Test request)
    {
        if (String.IsNullOrEmpty(request.Message))
            throw new ArgumentException("Message is required");

        return new TestResponse();
    }
}

以及以下请求/响应 DTO:

[Route("/test", "GET")]
public class Test : IReturn<TestResponse>
{
    public string Message { get; set; }
}

public class TestResponse
{
    public IList<Test> TestList { get; set; }
}

当我尝试访问 /test 时,我期望得到以下响应:

{
    "responseStatus": {
        "errorCode": "ArgumentException",
        "message": "Message is required",
        "errors": []
    }
}

相反,我得到了一个空的 JSON 响应。但是,它返回正确的状态代码(400 错误请求)。

我认为在 ServiceStack 中用 Something 和 SomethingResponse 来命名 DTO 是很常见的。为了让它以序列化 ResponseStatus 对象的形式返回异常,我发现我可以将我的请求 DTO 从 Test 重命名为 TestRequest 和/或在我的响应 DTO 中包含 ResponseStatus 属性。

这是预期的行为吗?

更新

我应该指出,仅当我的响应 DTO 的名称以 Response 结尾(区分大小写)时,才会出现此问题。如果我的请求/响应 DTO 分别称为 Foo 和 Bar,我会收到带有错误的格式正确的 JSON 响应。

最佳答案

首先,don't use interfaces on DTOs以及 ServiceStack Error Responses 上的文档它说:


错误响应类型

抛出异常时返回的错误响应根据常规命名的 {RequestDto}Response DTO 是否存在而有所不同。

如果存在:

无论服务方法的响应类型如何,都会返回{RequestDto}Response。如果 {RequestDto}Response DTO 具有 ResponseStatus 属性,则会填充该属性,否则不会返回 ResponseStatus

否则,如果没有:

返回一个通用的ErrorResponse,并带有填充的ResponseStatus属性。

Service Clients透明地处理不同的错误响应类型,对于 JSON/JSV/等无模式格式,在自定义或通用 ErrorResponse 中返回 ResponseStatus 之间没有实际可见的区别 -因为它们都在线路上输出相同的响应。


鉴于New API让您return clean responses在仍然保留错误信息的同时,您的 DTO 应该是:

[Route("/test", "GET")]
public class Test : IReturn<TestResponse>
{
    public string Message { get; set; }
}

public class TestResponse
{
    public List<Test> TestList { get; set; }

    public ResponseStatus ResponseStatus { get; set; }
} 

或者您可以不使用响应 DTO 并返回干净的列表,例如:

[Route("/test", "GET")]
public class Test : IReturn<List<Test>>
{
    public string Message { get; set; }
}

public class TestService : Service
{
    public List<Test> Get(Test request)
    {
        if (String.IsNullOrEmpty(request.Message))
            throw new ArgumentException("Message is required");

        return new List<Test>();
    }
}

关于serialization - ServiceStack异常序列化行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18224403/

相关文章:

c# - 从 WSDL 生成 ServiceStack 服务

php - 在 wp_postmeta 中将自定义字段数据保存为正确的序列化数组格式

java - 使用 writeUnshared() 序列化期间创建的对象数量

c# - Web 服务方法 - 无法序列化,因为它没有无参数构造函数

c# - 使用.NET Remoting时如何捕获未处理的异常

iOS Cloudsight 错误响应崩溃的应用程序

json - .Net Core Web API 每个 Controller 有不同的 JSON 大小写

php - 如何确定登录表单(Symfony 4)拒绝访问的原因?

c# - 在 ServiceStack 4 和 MySQL 中使用 Guid ID

servicestack - 请求被重定向到 login.aspx?ReturnUrl=