使用servicestack捕获异常

2023-11-22

我们使用 ServiceStack 来提供基于 REST 的服务已经有一段时间了,到目前为止,它的表现令人惊叹。

我们所有的服务都写成:

public class MyRestService : RestService<RestServiceDto>
{
   public override object OnGet(RestServiceDto request)
   {
   }
}

对于每个 DTO,我们都有 Response 等效对象:

public class RestServiceDto 
{
    public ResponseStatus ResponseStatus {get;set;}
}

它会处理所有抛出的异常。

我注意到的是,如果抛出异常OnGet() or OnPost()方法,那么 http 状态描述包含异常类的名称,就好像我抛出了一个:

new HttpError(HttpStatus.NotFound, "Some Message");

那么http状态描述包含文本“Some Message”。

由于其余一些服务正在抛出异常,而其他服务则抛出异常new HttpError(),我想知道是否有一种方法无需更改所有 REST 服务即可捕获任何异常并抛出new HttpError()?

例如,如果OnGet()方法抛出异常,然后捕获它并抛出new HttpError()?


使用旧 API - 继承自定义基类

当您使用旧的 API 来处理异常时,您应该提供一个自定义基类并重写 HandleException 方法,例如:

public class MyRestServiceBase<TRequest> : RestService<TRequest>
{
   public override object HandleException(TRequest request, Exception ex)
   {
       ...
       return new HttpError(..);
   }
}

然后,为了利用自定义错误处理,让所有服务继承您的类,例如:

public class MyRestService : MyRestServiceBase<RestServiceDto>
{
   public override object OnGet(RestServiceDto request)
   {    
   }
}

使用新 API - 使用 ServiceRunner

否则如果你正在使用ServiceStack改进的New API那么你不需要让所有服务都继承基类,而是可以通过重写 CreateServiceRunner 来告诉 ServiceStack 在 AppHost 中使用自定义运行器:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext)
{           
    return new MyServiceRunner<TRequest>(this, actionContext); 
}

其中 MyServiceRunner 只是一个实现您感兴趣的自定义挂钩的自定义类,例如:

public class MyServiceRunner<T> : ServiceRunner<T> {
    public override object HandleException(IRequestContext requestContext, 
        TRequest request, Exception ex) {
      // Called whenever an exception is thrown in your Services Action
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用servicestack捕获异常 的相关文章

随机推荐

  • 怎么去掉这些点啊!

    我正在 VS2008 的一个项目上编码 我试图按 CTR R E 将字段封装为属性 resharper 的功能 但我摸索着 现在我到处都是点 我有空格 我不知道如何摆脱它 例如 using System Namespace EgNamesp
  • C++ 从 hBitmap 获取 RGB

    使用位图对我来说是非常陌生的 所以我一直在努力阅读我读过的在线教程和策略 基本上我的目标是扫描屏幕以获取特定的 RGB 值 我相信执行此操作的步骤是在 hBitmap 中捕获屏幕 然后从中生成一个我可以扫描的 RGB 值数组 我最初从 Ge
  • 空基类优化

    引用 C 标准第 1 8 节中的两句话 对象是一个存储区域 基类子对象的大小可能为零 我不认为存储区域的大小可以为零 这意味着某些基类子对象实际上并不是对象 这些说法如何共存 对于 区域 的定义进行哲学争论是没有必要的 1 8 5 说 除非
  • 使一个条形的边框比其他条形更暗

    我在 ggplot2 中创建了一个条形图 其中 3 个条代表做出 3 个选择中的 1 个的概率 我想添加一个bolded显示正确响应的条形周围的边框 我还没有找到办法做到这一点 我可以改变所有条形的颜色 但不仅仅是一个 所附图像显示了我生成
  • 为什么 Spark Cassandra 连接器会失败并出现 NoHostAvailableException?

    我在让 Spark Cassandra Connector 在 Scala 中工作时遇到问题 我正在使用这些版本 斯卡拉2 10 4 火花核心 1 0 2 cassandra thrift 2 1 0 我安装的cassandra是v2 1
  • 升压 asio io_service.run()

    我只是想看一下 asio聊天服务器示例 我的问题是关于他们的使用情况io service run 功能 的文档io service run 函数说 run 函数会阻塞 直到所有工作都完成并且没有 更多处理程序被调度 或者直到 io serv
  • 使用 g++ 与 pragma 链接

    在 Visual C 中 可以通过以下方式链接到代码本身中的库 pragma comment lib libname lib g 中可能有类似的东西吗 The 升压配置库对自动链接有一些支持 使用特定编译器的相关编译器特定代码 然而 文档指
  • 如何在序列化 OData 响应时忽略 Null 值

    我需要从响应中完全省略空值字段 我可以通过修改正常 webapi 响应的 JsonFormatter 序列化设置来做到这一点 config Formatters JsonFormatter SerializationSettings Nul
  • 哪款相机会在移动设备中打开 getUserMedia API?前部还是后部?

    在桌面上使用getUserMedia API访问摄像头时 会打开网络摄像头 当然这对视频通信有帮助 但是在移动设备上使用时会调用哪个摄像头 前置摄像头还是后置摄像头 是否需要代码来选择相机 有一种解决方案 用户可以选择其中一台摄像机 使用
  • 从 PHP 检查 Google 地图点是否在多边形中

    我一直在寻找一种方法来检查一个点是否是多边形的一部分 该多边形是从文件加载的 与这个问题相关的所有答案都是用javascript解决的 但我需要在服务器端执行此操作 这是因为结果不需要作为 Web 客户端显示给用户 而是需要存储并稍后用作参
  • 我想使用 EBImage 包,但它说它不适用于我的 R 版本

    install packages 中的警告 软件包 EBImage 不可用 适用于 R 版本 3 2 4 修订版 现在该怎么办有什么帮助 请指导我 EBImage作为 Bioconductor 项目的一部分分发 要安装包 请使用 sourc
  • MongoDB 不区分大小写的键搜索

    我可以不区分大小写地查询值 但我想不敏感地查询键 以便用户可以以全部小写形式键入它们 这不起作用 因为它不是有效的 JSON lastName i Jones 除了将新的键集合作为值之外 是否有我可以使用的策略 目前还没有办法做到这一点 M
  • 无法在 Google App Engine 中调试 dev_appserver

    我不认为这个问题是 PyDev 所独有的 而是任何 python 调试器所独有的 使用 Eclipse 和 pydev 我无法在 dev appserver Google 应用程序引擎开发服务器 进程中中断 WSGI 处理程序 我不是 10
  • MySQL Workbench 会话看不到数据库更新

    我使用 deb 在 Ubuntu 系统中安装了 MySQL Workbench community 6 2 3 工作台会话似乎没有看到其他会话 应用程序 命令行客户端 对数据库完成的更新 DML 新会话能够在启动时看到数据库的正确状态 但随
  • 动态更改源后加载音频元素

    我的页面正文中出现了几个音频元素 他们看起来像这样
  • python中有内置的恒等函数吗?

    我想指出一个不执行任何操作的函数 def identity args return args 我的用例是这样的 try gettext find gettext gettext else identity 当然 我可以使用identity上
  • java.lang.ClassNotFoundException: org.joda.time.ReadablePartial

    我使用 Eclipse Luna 和 Jaspersoft Studio 插件 6 2 2 来生成 Web 应用程序的开发人员报告 从 Eclipse 插件运行一份基本的空白报告没有问题 但是当我从 java 类加载此 jrxml 时 我收
  • 如何使用 ajax POST 到 php

    我似乎不知道如何使用ajax 来发帖 我做了一个愚蠢的表格来尝试一下 即使将其一直削减到只有两个值 仍然无法让任何东西发挥作用 我的html是这样的
  • MS Graph API C# 将用户添加到组

    我一直在研究如何使用 Microsoft Graph API nuget 上提供的 dotnet C 库 从 Azure AD 组中添加 以及稍后删除 用户 Nuget MS Graph API 忽略与连接相关的所有其他内容GraphSer
  • 使用servicestack捕获异常

    我们使用 ServiceStack 来提供基于 REST 的服务已经有一段时间了 到目前为止 它的表现令人惊叹 我们所有的服务都写成 public class MyRestService RestService