asp.net-mvc – 如何添加日志到MVC4 WebApi
发布时间:2020-05-23 16:03:29 所属栏目:asp.Net 来源:互联网
导读:我试图为ApiController上的Get()创建一个[LoggedApiCall]过滤器 据此: ASP.NET Web API ActionFilter example 我创建了一个System.Web.HttpFilters.ActionFilterAttribute。 覆盖允许OnActionExecuted(HttpActionExecutedContext actionExecute
|
我试图为ApiController上的Get()创建一个[LoggedApiCall]过滤器
我创建了一个System.Web.HttpFilters.ActionFilterAttribute。 我似乎找不到从HttpActionExecutedContext获取调用者的IP的方法 也许我打算记录每个API调用错误的方式? 解决方法我们使用我们添加到HttpConfiguration.Filters的以下过滤器。一些代码:internal class LoggingFilter : IExceptionFilter,IActionFilter
{
private readonly ILog log;
public LoggingFilter(ILog log)
{
if (log == null)
{
throw new ArgumentNullException("log");
}
this.log = log;
}
public bool AllowMultiple
{
get { return false; }
}
Task IExceptionFilter.ExecuteExceptionFilterAsync(HttpActionExecutedContext actionContext,CancellationToken cancellationToken)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
this.log.Error(string.Format("Unexpected error while executing {0}",this.BuildLogEntry(actionContext.ActionContext)),actionContext.Exception);
return TaskHelpers.Completed();
}
Task<HttpResponseMessage> IActionFilter.ExecuteActionFilterAsync(HttpActionContext actionContext,CancellationToken cancellationToken,Func<Task<HttpResponseMessage>> continuation)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
if (continuation == null)
{
throw new ArgumentNullException("continuation");
}
if (!this.log.IsDebugEnabled)
{
// no point running at all if logging isn't currently enabled
return continuation();
}
string logEntry = this.BuildLogEntry(actionContext);
IDisposable logContext = this.log.DebugTiming("Executing {0}",logEntry);
Task<string> requestContent;
if (actionContext.Request.Content != null)
{
requestContent = actionContext.Request.Content.ReadAsStringAsync().ContinueWith(requestResult => string.IsNullOrEmpty(requestResult.Result) ? "N/A" : requestResult.Result);
}
else
{
requestContent = TaskHelpers.FromResult("N/A");
}
return requestContent.ContinueWith(
requestResult =>
{
this.log.DebugFormat("{0},Request = {1}",logEntry,requestResult.Result);
return continuation()
.ContinueWith(t =>
{
Task<string> responseContent;
if (t.IsCompleted && t.Result.Content != null)
{
responseContent = t.Result.Content.ReadAsStringAsync().ContinueWith(responseResult => string.IsNullOrEmpty(responseResult.Result) ? "N/A" : responseResult.Result);
}
else
{
responseContent = TaskHelpers.FromResult("N/A");
}
return responseContent.ContinueWith(
responseResult =>
{
using (logContext)
{
this.log.DebugFormat("{0},Status Code: {1},Response = {2}",t.Result.StatusCode,responseResult.Result);
}
return t.Result;
});
}).Unwrap();
}).Unwrap();
}
/// <summary>
/// Builds log data about the request.
/// </summary>
/// <param name="actionContext">Data associated with the call</param>
private string BuildLogEntry(HttpActionContext actionContext)
{
string route = actionContext.Request.GetRouteData().Route.RouteTemplate;
string method = actionContext.Request.Method.Method;
string url = actionContext.Request.RequestUri.AbsoluteUri;
string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
string actionName = actionContext.ActionDescriptor.ActionName;
return string.Format("{0} {1},route: {2},controller:{3},action:{4}",method,url,route,controllerName,actionName);
}
}
我们使用log4net,您可以用任何您认为合适的替换ILog实现。 ILog.DebugTiming只是一种扩展方法,它使用秒表来获取每次调用的时间。 编辑: 干杯,院长 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-core – 在发布ASP.NET Core应用程序时自动执行迁移
- asp.net – 在.NET 4.5中混合使用Windows和Forms身份验证:
- asp.net-mvc – 在Azure上使用LocalDb MDF文件
- asp.net repeater手写分页实例代码
- 使用asp.net中的web api通过http进行身份验证
- ASP.NET – 可以从服务器代码触发回发吗?
- 问题在ASP.NET 5(Core)中添加对类库项目的引用
- .net – 如果选中复选框,如何制作文本框
- 这个ASP.NET功能在哪里记录? %= string format,params ob
- asp.net-mvc-4 – 没有为此对象定义的无参数构造函数.在剑道
推荐文章
站长推荐
- 长时间运行的任务 – 最佳实践 – ASP.NET 4.0,C
- asp.net-mvc – 对HTTP POST请求的正确响应是什么
- asp.net-web-api – 如何访问所有querystring参数
- asp.net-mvc – 404 Asp.Net中的Http错误处理程序
- asp.net-mvc-5 – nuget中用于与WEB API集成的Ni
- asp.net-mvc-3 – 如何使用剃刀包括.html或.asp文
- asp.net-mvc – ASP.Net MVC2自定义模板通过Ajax
- ASP.NET与IIS VS PHP与Apache
- ASP.NET WebApi:(405)方法不允许
- asp.net – 在运行时更改SqlDataSource.SelectCo
热点阅读
