我使用这行代码进行错误处理:
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
这可能吗?
答案 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 : ""));
}