【问题标题】:ServiceStack Can not get real exception messageServiceStack 无法获得真正的异常消息
【发布时间】:2016-12-27 09:22:24
【问题描述】:

服务器端

public class MyServices : Service { public object Get(Hello request) { throw new InvalidOperationException("test error message"); //return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) }; } }

客户端

try { var client = new JsonServiceClient("http://localhost:28586/"); var response = client.Get<HelloResponse>(new Hello { Name = "DHJ" }); } catch (WebServiceException ex) { // ex.ErrorCode = "InvalidOperationException" // No Problem. // ex.ErrorMessage = null // always null. Why? }

我看到了 ServiceStack 的文档,如下所示:

抛出 C# 异常

在大多数情况下,您不需要关心 ServiceStack 的错误处理,因为它为抛出 C# 异常的正常用例提供了本机支持,例如:

公共对象发布(用户请求) { if (string.IsNullOrEmpty(request.Name)) throw new ArgumentNullException("Name"); } C# 异常到 HTTP 错误的默认映射

默认情况下 C# 异常:

从 ArgumentException 继承返回的 HTTP StatusCode 为 400 BadRequest NotImplementedException 或 NotSupportedException 作为 405 MethodNotAllowed 返回 AuthenticationException 返回为 401 Unauthorized UnauthorizedAccessException 作为 403 Forbidden 返回 OptimisticConcurrencyException 作为 409 冲突返回 其他正常的 C# 异常返回为 500 InternalServerError 可以使用 Config.MapExceptionToStatusCode 上的用户定义映射扩展此列表。

【问题讨论】:

    标签: exception servicestack


    【解决方案1】:

    您的HelloResponse 类需要ResponseStatus 属性,来自Error Handling docs

    错误响应类型

    抛出异常时返回的错误响应取决于是否存在常规命名的{RequestDto}Response DTO。

    如果存在:

    无论服务方法的响应类型如何,都会返回{RequestDto}Response。如果 {RequestDto}Response DTO 具有 ResponseStatus 属性,则会填充它,否则不会返回任何 ResponseStatus。 (如果您已使用 [DataContract]/[DataMember] 属性修饰了 {ResponseDto}Response 类和属性,则还需要修饰 ResponseStatus 以填充)。

    否则,如果没有:

    一个通用的 ErrorResponse 被返回一个填充的 ResponseStatus 属性。

    【讨论】:

    • 是的,你是对的,但这是否意味着我每次都必须在每个 ResponseDTO 上添加一个属性“ResponseStatus”?而且我认为这不是一个好主意。
    • @LeoDeng 请重新阅读我的答案,如果您的响应 DTO 遵循 {RequestDto}Response 命名约定,则只需添加 ResponseStatus 属性,如果不使用,ServiceStack 将使用通用 @ 987654332@ DTO 用于已经包含 ResponseStatus 属性的错误,因此您的响应 DTO 不需要它。
    • @LeoDeng 我已经介绍过这个,所以请非常非常仔细地阅读我的回答。如果您有 HelloResponse DTO,您需要添加您自己的 ResponseStatus 属性,因为 ServiceStack 将使用您的 HelloResponse DTO(如果存在),因此如果您的 Response DTO 没有 ResponseStatus 属性,ServiceStack 什么都没有将错误响应注入。如果您没有HelloResponse DTO,即没有名为HelloResponse 的类,那么ServiceStack 将使用通用的ErrorResponse DTO。
    猜你喜欢
    • 2011-09-26
    • 2019-09-01
    • 2019-11-03
    • 1970-01-01
    • 2018-09-22
    • 2017-02-13
    • 2012-07-02
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多