我是ServiceStack的新手,我正在关注我http://nilsnaegele.com/codeedge/servicestack1.html的例子,我发现它很有用。 我读到新API中不需要DTO响应声明中的显式StatusResponse字段,但我似乎没有得到预期的行为。
使用ServiceStack 3.9.71。
我在EntryService帖子中引入了一个Exception,以了解客户端处理。
public object Post(Entry request)
{
if (request.Quantity == 3)
{
throw new WebException("post entry");
}
}
使用
public class EntryResponse
{
public int Id { get; set; }
}
然后在客户端发布条目时处理异常。
try
{
var entryRequest = new Entry {Quantity = quantity, EntryTime = DateTime.Now};
var response = client.Send(entryRequest);
Console.WriteLine("Response: {0}", response.Id);
}
catch (WebServiceException wse)
{
// At this point wse.ResponseStatus field is null.
}
我测试了将ResponseStatus字段显式添加到EntryResponse,这产生了在客户端上填写的ResponseStatus,而没有更改客户端代码。
然后我尝试在StatusRequestService中抛出一个异常,如下所示,看看第二个Web服务客户端请求的行为方式是否相同,看起来它的行为方式不同。
public object Any(StatusRequest request)
{
if (request.Lever == 3)
{
throw new WebException("get status.");
}
}
以下内容。
public class StatusResponse
{
public int Total { get; set; }
public int Goal { get; set; }
}
然后按照
在客户端中捕获try
{
var postResponse = client.Post<StatusResponse>("status", new StatusRequest { Date = DateTime.Now, Lever = 3 });
Console.WriteLine("{0} of {1} achieved", postResponse.Total, postResponse.Goal);
}
catch (WebServiceException wse)
{
// At this point wse.ResponseStatus field is valid and filled in.
}
答案 0 :(得分:1)
如果您想使用{RequestDto}Response
约定并确保返回ResponseStatus,您必须选择加入并将其添加到Response DTO,例如:
public class StatusResponse
{
public int Total { get; set; }
public int Goal { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
这是因为explicit exception for Responses遵循约定{RequestDto}Response
命名约定:
无论服务方法的响应类型如何,都会返回{RequestDto}Response
。如果{RequestDto}Response
DTO具有 ResponseStatus 属性,则会填充该属性,否则将不会返回 ResponseStatus 。 (如果您使用{ResponseDto}Response
属性修饰了[DataContract]/[DataMember]
类和属性,那么 ResponseStatus 也需要进行修饰,以便填充。
通过填充 ResponseStatus 属性返回通用ErrorResponse
。
Service Clients透明地处理不同的错误响应类型,对于无模式格式(如JSON / JSV / etc),在自定义或通用中返回 ResponseStatus 之间没有实际的明显区别ErrorResponse
- 因为它们都在线上输出相同的响应。