获取文件名,而不是控制器的名称
问题描述:
我使用这行代码的错误处理的:获取文件名,而不是控制器的名称
catch (Exception exception)
{
string controllerAction = [email protected]"{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 : ""));
}
字符串controllerAction给我控制器名称/动作名称。
我想保存控制器的文件名,而不是控制器名称。
因此,而不是:
HomeController
我想记录:
HomeController.cs
而且已经controllerAction返回类似:
HomeController.cs/MyAction
这可能吗?
答
最好的方法要做到这一点是使用.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
我强烈建议您在需要从当前帧中提取信息时使用这些属性。偶尔,运行时会'在线调用更小的方法来提高性能。属性受到最大的影响。这些属性在编译时注入信息,所以即使调用内联,信息也会保留。
答
一个简单的方法,我可以想像只是通过附加“的.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 : ""));
}
您可以使用反射来查询调用堆栈,并从中获取详细信息 – DiskJunky
也许您有代码示例? – FrenkyB
查看此答案的详细信息。我强烈建议使用编译时间属性,因为有时堆栈跟踪将成为内联的受害者。 https://stackoverflow.com/questions/31518803/get-the-filename-from-stacktrace-and-frame-when-throw-an-exception – Gusdor