【问题标题】:How to get user specific exception details in case of multi user system?在多用户系统的情况下如何获取用户特定的异常详细信息?
【发布时间】:2016-12-05 19:45:42
【问题描述】:

假设在一个应用程序中同时有多个用户在线。由于某种原因,有 4 个用户出现异常。由于我们在 Global.asax 文件中实现了全局异常处理,因此我们向所有用户显示自定义错误页面并使用以下代码记录错误:

var currentException = Server.GetLastError();
logger.LogDetails(currentException); // some logging code
Server.ClearError();
  1. 用户 1 出现除以零异常。
  2. 用户 2 收到无效的强制转换异常。
  3. 用户 3 遇到索引超出范围异常。
  4. 用户 4 遇到了一些 Sqlexception。

在这种情况下,这个 Server.GetLastError() 会返回什么? 另外,我需要记录异常。所以可以把它想象成,我想记录基于用户的异常作为键和异常详细信息作为描述。因此,对于用户 1,将有一个类似于 User=U1, ExceptionDescription="Divide By zero" 的日志条目。

正如史蒂夫在 cmets 中建议的那样,我可以使用 HTTPContext 获取当前用户,但仍然无法获取他们会话中发生的异常。我怎样才能做到这一点?

【问题讨论】:

  • 全部 4 个,4 次
  • 那么我怎样才能获得需要记录的用户特定异常详细信息?
  • 我猜你可以检查 httpcontext 看看是哪个用户
  • 但是 Server.GetLastError 仍然不会返回不特定于当前用户的随机异常。
  • 不太明白你的问题。上下文将是当前用户,否则您将如何将正确的用户重定向到正确的错误屏幕

标签: c# asp.net asp.net-mvc exception-handling


【解决方案1】:

您似乎担心 GetLastError 会返回最后发生的任何错误,而不管用户是谁,如果四个用户收到错误,则可能存在串扰,他们可以看到彼此的错误(或者日志代码可能会记录错误的用户名错误的错误)。事实并非如此。

GetLastError 是特定于会话的,或者更准确地说,是特定于线程的。它只会返回接收当前线程响应的用户触发的错误。

GetLastError 函数

检索调用线程的最后一个错误代码值。最后一个错误代码是在每个线程的基础上维护的。多个线程不会覆盖彼此的最后一个错误代码。

Link

所以只要使用史蒂夫的答案,你应该很高兴。

【讨论】:

  • 您分享的所有链接都与 C++ 相关,在我的例子中是 C#。所以只是想确认两者相同还是Server,C#中的GetlastError()和C++的GetLastError函数不同?
【解决方案2】:
var currentException = Server.GetLastError();
var user = HttpContext.Current.User;
logger.LogDetails(currentException, user); // some logging code
Server.ClearError();

您可以在登录之前获取用户,这将是错误的当前用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2020-06-19
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多