免责声明:我是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中使用Something然后SomethingResponse以这种方式命名您的DTO是很常见的。为了让它将异常作为序列化的ResponseStatus对象返回,我发现我可以将我的请求DTO从Test重命名为TestRequest和/或在我的响应DTO中包含ResponseStatus属性。
这是预期的行为吗?
更新
我应该包括只有在我的响应DTO的名称以Response结尾(区分大小写)时才会出现此问题。如果我的请求/响应DTO分别被称为Foo和Bar,我会收到带有错误的格式正确的JSON响应。
答案 0 :(得分:5)
首先,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),在自定义或通用中返回 ResponseStatus 之间没有实际的明显区别ErrorResponse
- 因为它们都在线上输出相同的响应。
鉴于New API允许您[{3}}同时仍然保留错误信息,您的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>();
}
}