客户端WebServiceException具有ResponseStatus null,没有显式的ResponseStatus

时间:2013-12-12 01:48:15

标签: error-handling client servicestack

我是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.
}

1 个答案:

答案 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 - 因为它们都在线上输出相同的响应。