我对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.
}
最佳答案
如果要使用{RequestDto}Response
约定并确保返回ResponseStatus,则必须选择加入并将其添加到Response DTO,例如:
public class StatusResponse
{
public int Total { get; set; }
public int Goal { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
这是因为存在遵循约定
{RequestDto}Response
命名约定的explicit exception for Responses:如果存在:
无论服务方法的响应类型如何,都会返回
{RequestDto}Response
。如果{RequestDto}Response
DTO具有 ResponseStatus 属性,则将其填充,否则将不返回 ResponseStatus 。 (如果已使用{ResponseDto}Response
属性修饰了[DataContract]/[DataMember]
类和属性,则还需要修饰 ResponseStatus )。否则,如果没有:
使用填充的 ResponseStatus 属性返回通用
ErrorResponse
。Service Clients透明地处理不同的错误响应类型,对于无模式格式(如JSON/JSV/etc),在自定义或通用
ErrorResponse
中返回 ResponseStatus 之间没有实际可见的区别-因为它们都在网络上输出相同的响应。