如何在多用户系统的情况下获取用户特定的异常详细信息?

时间:2016-12-05 19:45:42

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

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

var currentException = Server.GetLastError();
logger.LogDetails(currentException); // some logging code
Server.ClearError();
  1. 用户1获得零除异常。
  2. 用户2获得了无效的强制转换异常。
  3. 用户3将索引超出范围异常。
  4. 用户4获得了一些Sqlexception。
  5. 在这种情况下,此Server.GetLastError()将返回什么? 另外,我需要记录异常。所以把它想象成一样,我想根据用户的关键异常和异常细节作为描述来记录异常。因此对于用户1,将存在类似User = U1,ExceptionDescription =“Divide By zero”的日志条目。

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

2 个答案:

答案 0 :(得分:1)

var currentException = Server.GetLastError();
var user = HttpContext.Current.User;
logger.LogDetails(currentException, user); // some logging code
Server.ClearError();

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

答案 1 :(得分:1)

您似乎担心GetLastError会返回上次发生的任何错误而不管用户是什么,如果有四个用户收到错误,则可能会出现串扰并且他们可能会看到彼此的错误(或者日志记录代码可能会记录错误的用户名错误的错误)。事实并非如此。

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

  

GetLastError函数

     

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

Link

所以,只要使用史蒂夫的回答,你应该好好去。