获取文件名而不是控制器名称

时间:2017-10-10 09:39:49

标签: c# asp.net-mvc

我使用这行代码进行错误处理:

      catch (Exception exception)
      {
string controllerAction = $@"{ControllerContext.RouteData.Values["controller"].ToString()}Controller/{ControllerContext.RouteData.Values["action"].ToString()}";
        iCommCommon.CommWeb.WriteLog("<ERR>", CommUser.piUSER_KEY, controllerAction, exception.Message + "\n" + (exception.InnerException != null ? exception.InnerException.Message : ""));
      }

String controllerAction为我提供控制器名称/操作名称。

我想保存控制器的文件名,而不是控制器名称。

所以,而不是:

HomeController

我想记录:

HomeController.cs

让controllerAction返回类似的内容:

HomeController.cs/MyAction

这可能吗?

2 个答案:

答案 0 :(得分:3)

最好的方法是使用.net 4.0中添加的编译器服务属性。

public void Log([CallerFilePath]string path="",[CallerLineNumber]int lineNumber=0,[CallerMemberName] string memberName="")
{
    Console.WriteLine(path + " " + lineNumber + " " + memberName);
}

从这个答案中无耻地偷走了。 Upvote它! Get the filename from stacktrace and frame when throw an exception

我强烈建议您在需要从当前帧中提取信息时使用这些属性。有时,运行时会调用较小的方法来提高性能。财产受到的影响最大。这些属性在编译时注入信息,因此即使内联调用,也会保留信息。

答案 1 :(得分:1)

我可以想象的一个简单方法就是附加“.cs”,因为你已经附加了“控制”这个词

    public string getFormattedRoute()
    {
        StringBuilder _strBldUri = new StringBuilder();
        _strBldUri.Clear();
        _strBldUri.Append(ControllerContext.RouteData.Values["controller"]);
        _strBldUri.Append("Controller");
        _strBldUri.Append(".cs/");
        _strBldUri.Append(ControllerContext.RouteData.Values["action"]);
        return _strBldUri.ToString();
    }

并像那样使用

   catch (Exception exception)
  {
       string controllerAction = getFormattedRoute();
       iCommCommon.CommWeb.WriteLog("<ERR>", CommUser.piUSER_KEY, controllerAction, exception.Message + "\n" + (exception.InnerException != null ? exception.InnerException.Message : ""));
  }