免责声明:我是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

否则,如果没有:

使用填充的 ResponseStatus 属性返回通用ErrorResponse

Service Clients透明地处理不同的错误响应类型,对于无模式格式(如JSON/JSV/etc),在自定义或通用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; }
}

或者,您可以不使用Response 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>();
    }
}

10-08 18:06