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

问题描述:

我使用这行代码的错误处理的:获取文件名,而不是控制器的名称

 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 

这可能吗?

+0

您可以使用反射来查询调用堆栈,并从中获取详细信息 – DiskJunky

+0

也许您有代码示例? – FrenkyB

+1

查看此答案的详细信息。我强烈建议使用编译时间属性,因为有时堆栈跟踪将成为内联的受害者。 https://stackoverflow.com/questions/31518803/get-the-filename-from-stacktrace-and-frame-when-throw-an-exception – Gusdor

最好的方法要做到这一点是使用.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

如果你要“无耻地窃取”另一个答案,为什么不选择作为一个愚蠢的关闭? – DavidG

+0

主要是因为我添加了比链接答案更多的信息。在SO上提取其他答案的片段有很多优先级。如果你不喜欢它,请降低或标记它。 – Gusdor

+0

然后在其他问题上添加详细信息,而不是在这里。 – DavidG

一个简单的方法,我可以想像只是通过附加“的.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 : "")); 
    } 
+1

这不能保证工作,文件名不一定匹配类名称。 – DavidG

+0

我不明白这个情况。由于他在谈论从路线数据中获取控制器名称,有没有一种情况下控制器将处于不是类的文件中?或者你是指一种更一般的方法? I –

+0

我在说这是一个约定,一个类在名称匹配的文件中,但事实并非总是如此。例如,部分类如何? – DavidG