【发布时间】:2018-12-02 16:28:51
【问题描述】:
我正在开发一个 web api 项目,我想使用记录器将 web api 中的所有控制器记录到文件中。
[HttpGet]
[Route("")]
public IActionResult GetAllDocumentTempates()
{
try
{
var document = _doumentTemplate.GetLiteDocumentReportTemplates().ToList();
var result = Mapper.Map<IEnumerable<LiteDocumentReportTemplateViewModel>>(document);
return Ok(result);
}
catch (Exception ex)
{
String msgInnerExAndStackTrace = string.Format("{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, ex.StackTrace);
ExceptionLoggingService.Instance.WriteLog(string.Format("From frmDelivery.ConditionallyPrint():{0}", msgInnerExAndStackTrace));
return BadRequest();
}
}
This is my ExceptionLoggingService.cs:
这是为我处理所有错误并记录到文件的服务
public class ExceptionLoggingService: ActionFilterAttribute
{
// </ Singleton code
// private fields
private readonly FileStream _fileStream;
private readonly StreamWriter _streamWriter;
private static ExceptionLoggingService _instance;
// public property
public static ExceptionLoggingService Instance
{
get
{
return _instance ?? (_instance = new ExceptionLoggingService());
}
}
//private constructor
private ExceptionLoggingService()
{
_fileStream = File.OpenWrite(GetExecutionFolder() + "\\EasyAsFallingOffA.log");
_streamWriter = new StreamWriter(_fileStream);
}
// <!-- Singleton code
public void WriteLog(string message)
{
if (!HHSConsts.Logging) return;
StringBuilder formattedMessage = new StringBuilder();
formattedMessage.AppendLine("Date: " + DateTime.Now.ToString());
formattedMessage.AppendLine("Message: " + message);
_streamWriter.WriteLine(formattedMessage.ToString());
_streamWriter.Flush();
}
private string GetExecutionFolder()
{
return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
}
这是我的EasyAsFallingOffA.log 文件输出
日期:2018 年 6 月 23 日下午 12:02:24 消息:来自 frmDelivery.ConditionallyPrint():对象引用未设置为对象的实例。;内例:;堆栈跟踪:在 C:\Users\BABATUNDE\Documents\Visual Studio 2017\Projects\pcm-netcore\ProcessFlowManager.Domain\Helpers\ModelFactory.cs:line 1170 中的 ProcessFlowManager.Domain.Helpers.ModelFactory.Create(CalendarActivity cal) 在 C:\Users\BABATUNDE\Documents\Visual Studio 2017\Projects\pcm-netcore\ProcessFlowManager.Infrastructure\LogicImplementations\EfCalendarActivities.cs:line 54 中的 ProcessFlowManager.Infrastructure.LogicImplementations.EfCalendarActivities.GetCalendarActivity(Int32 id) 在 C:\Users\BABATUNDE\Documents\Visual Studio 2017\Projects\pcm-netcore\ProcessFlowManager.API\Controllers\CalendarController.cs:line 79 中的 ProcessFlowManager.API.Controllers.CalendarController.GetAllGeneratedDcument(Int32 id) 处
上面的所有代码一切正常,但所有这些代码都是使用重言式实现的,因为我在我所有的 try 和 catch 中重复。我是 AOP 的新手,正在寻找一种使用 AOP 执行此操作的方法,这样我就可以在我的控制器中调用它一次。
【问题讨论】:
-
我需要使用面向方面的编程来实现这一点,但已经尝试了一切但都无济于事,我不想使用第三方
-
我需要一些建议,请不要介绍第三方,因为它不是免费的
标签: c# asp.net asp.net-web-api2 asp.net-core-webapi