2

免责声明:我对 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 Bad Request)。

我认为在 ServiceStack 中以这种方式命名你的 DTO 是很常见的,先是Something,然后是SomethingResponse。为了让它将异常作为序列化的 ResponseStatus 对象返回,我发现我可以将我的请求 DTO 从 Test 重命名为 TestRequest 和/或在我的响应 DTO 中包含一个 ResponseStatus 属性。

这是预期的行为吗?

更新

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

4

1 回答 1

5

首先,不要在 DTO 上使用接口,对于ServiceStack 错误响应上的文档,它说:


错误响应类型

抛出异常时返回的错误响应取决于是否存在常规命名的{RequestDto}ResponseDTO。

如果存在:

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

否则,如果没有:

ErrorResponse使用填充的ResponseStatus属性返回泛型。

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


鉴于新 API允许您返回干净的响应,同时仍保留错误信息,您的 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>();
    }
}
于 2013-08-14T06:35:03.993 回答