【问题标题】:How to deal with exception thrown by Web API controller?如何处理 Web API 控制器抛出的异常?
【发布时间】:2017-06-20 17:40:00
【问题描述】:

我正在使用 Enterprise Tester API 来导入和更新 Web 应用程序上的内容。该程序可以正常运行几个小时,但偶尔会遇到这个未处理的异常:

EnterpriseTester.API.Client.dll 中出现“System.Net.Http.HttpRequestException”类型的未处理异常

附加信息:System.Net.Http.HttpRequestException 状态码不表示成功:500(内部服务器错误)

此时,Visual Studio 在发生此异常的行处中断。但是,当我点击“继续”时,程序会再次正常执行。

从网上搜索,看来我应该使用try catch 块来处理异常。我还希望能够稍等片刻,再次执行同一行以访问 API。

    try
    {
        client.UpdateScriptRun(Id,Run);
    }
    catch (HttpRequestException e)
    {
        Console.Writeline("HttpRequestException: {0}", e.Message);
        Thread.Sleep(1000);
        client.UpdateScriptRun(Id,Run);
     }

我不确定这样的事情是否能解决问题,或者我是否需要寻找完全不同的解决方案。

如果您能指导我找到适合此问题的解决方案,我们将不胜感激。谢谢!

【问题讨论】:

  • 您在上面发布的代码是否在 WebApiController 中运行?如果第一次调用引发异常,为什么要让 POST 挂起?为什么不从您的控制器返回 500,然后让您的客户端再试一次?
  • @maccettura 感谢您的提问。上面的代码来自控制台应用程序。该应用程序正在将我桌面上的一千多个文档/脚本导入 Enterprise Tester。 “UpdateScriptRun”是我的程序调用 POST 的 API 方法之一。如果我返回 500,那么客户端将不得不再次从头运行该程序。作为替代解决方案,您有什么建议?

标签: c# visual-studio asp.net-web-api exception-handling httprequest


【解决方案1】:

通常最好追踪异常的根本原因,看看是否有办法解决它。如果由于网络出现间歇性问题而发生连接错误,这是一回事,但 500 错误表明服务器出现问题。如果您有任何方法可以追踪并修复服务器端错误,那是最好的方法。

如果您无法控制服务器,并且只是在知道服务器偶尔会无缘无故发生故障的情况下试图让自己的应用程序尽可能好地运行,那么 try/catch 解决方案会有所帮助。不过,我会提出一些额外的建议:

  1. 使用更强大的日志记录机制,这样您就可以从日志文件中判断出问题的频率,并可能使用该信息来追踪问题。在您的日志消息中包含参数,以防该信息被证明是有用的。
  2. 创建一个帮助方法来帮助您重试,以便您可以在其他地方重用该模式。
  3. 在此辅助方法中,首先几乎立即重试,然后等待呈指数增长的时间段(10 毫秒、100 毫秒、1000 毫秒),直到您看到成功或达到合理的最大限制。
  4. 无论什么在使用您的代码,都应该有自己的 try/catch,以确保用户在事情不正常时有良好的体验。

【讨论】:

  • 感谢您的回答。由于我无法访问服务器端,因此您对辅助方法的建议听起来很有希望。对于这个解决方案,我应该在“catch”块中使用我的辅助方法吗?或者您是否建议在辅助方法中使用 try-catch。如果我的问题看起来微不足道,我深表歉意,我对此一点也不熟悉。任何指向相关主题的有用链接也会有所帮助。谢谢!
  • 将 try/catch 放入您的辅助方法 kind of like this 内的循环中。或者您可能会发现使用其他人编写的库是值得的,例如 Polly
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2022-11-29
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多