C#-ASP.Net MVC AsyncController日志请求处理时间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-ASP.Net MVC AsyncController日志请求处理时间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3793字,纯文字阅读大概需要6分钟。
内容图文
![C#-ASP.Net MVC AsyncController日志请求处理时间](/upload/InfoBanner/zyjiaocheng/675/ac39964b6a064826b771f8a435fba342.jpg)
我需要获取asp.net MVC的请求处理时间.我使用IHttpModule订阅onBeginRequest和onEndRequest事件.对于同步控制器,它工作得很好,但对于异步,它返回错误的结果(例如,当实时时间大约为2分钟时为20毫秒).如何以一般方式获取AsyncController的请求处理时间(不为每个异步操作在ActionAsync / ActionCompleted中编写附加代码)?
public class TrackRequestModule : RequestProcessingModuleBase, IHttpModule
{
public const string BeginRequestTimeKey = "beginRequestTime";
public void Init(HttpApplication context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.BeginRequest += onBeginRequest;
context.EndRequest += onEndRequest;
}
private void onEndRequest(object sender, EventArgs e)
{
InvokeHandler(sender, OnEndRequest);
}
private void onBeginRequest(object sender, EventArgs e)
{
InvokeHandler(sender, OnBeginRequest);
}
public void OnBeginRequest(HttpContextBase context)
{
context.Items[BeginRequestTimeKey] = DateTime.Now.ToLocalTime();
}
public void OnEndRequest(HttpContextBase context)
{
var beginRequestTime = (DateTime)context.Items[BeginRequestTimeKey];
TimeSpan elapsedTime = DateTime.Now.ToLocalTime() - beginRequestTime;
var info = new RequestData
{
BeginTime = beginRequestTime,
ElapsedTimeMilliseconds = elapsedTime.Milliseconds,
Url = context.Request.Url.AbsoluteUri,
Data = GetRequestData(context.Request)
};
ThreadPool.QueueUserWorkItem(logRequestInfo, info);
}
public void Dispose() { }
private void logRequestInfo(object state)
{
var info = (RequestData)state;
var queryStore = ObjectBuilder.Instance.Resolve<IRequestTrackingDataQueryStore>();
queryStore.SaveRequestTrackingData(info.BeginTime, info.ElapsedTimeMilliseconds, info.Url, info.Data);
}
private sealed class RequestData
{
public DateTime BeginTime { get; set; }
public int ElapsedTimeMilliseconds { get; set; }
public string Url { get; set; }
public string Data { get; set; }
}
}
解决方法:
真奇怪通常情况下,这种情况应该可行.不幸的是,您没有显示代码,因此很难说出您做错了什么.
此外,我无法复制它.这是我编写的要测试的模块:
public class MeasureModule : IHttpModule
{
private static readonly ReaderWriterLockSlim _gateway = new ReaderWriterLockSlim();
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += (sender, e) =>
{
var app = (sender as HttpApplication);
var watch = Stopwatch.StartNew();
app.Context.Items["watch"] = watch;
};
context.EndRequest += (sender, e) =>
{
var app = (sender as HttpApplication);
var watch = app.Context.Items["watch"] as Stopwatch;
watch.Stop();
var url = app.Context.Request.Url.AbsoluteUri;
var message = string.Format("url: {0}, time: {1}ms", url, watch.ElapsedMilliseconds);
var log = HostingEnvironment.MapPath("~/log.txt");
_gateway.EnterWriteLock();
try
{
File.AppendAllLines(log, new[] { message });
}
finally
{
_gateway.ExitWriteLock();
}
};
}
}
我在web.config中注册的(我在Cassini下测试过,如果您打算使用IIS 7,则必须在相应的< system.webServer>部分中注册该模块):
<httpModules>
<add name="measure" type="MvcApplication.Modules.MeasureModule, MvcApplication" />
</httpModules>
然后写了一个样本控制器来测试:
[SessionState(SessionStateBehavior.Disabled)]
public class HomeController : AsyncController
{
public ActionResult IndexSync()
{
Thread.Sleep(5000);
return Content("completed", "text/plain");
}
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
AsyncManager.OutstandingOperations.Decrement();
});
}
public ActionResult IndexCompleted()
{
return Content("completed", "text/plain");
}
}
然后,我向以下网址触发了两个并行的HTTP请求:
> / home / index
> / home / indexsync
2个请求在大约5秒钟后按预期完成,日志文件看起来完全正常:
url: http://localhost:14953/home/index, time: 5047ms
url: http://localhost:14953/home/indexsync, time: 5005ms
如您所见,HTTP模块正确地测量了异步和同步操作的执行时间.
那有什么呢?
顺便说一句,您可以结帐MiniProfiler并确保没有针对您的方案的重新设计.
内容总结
以上是互联网集市为您收集整理的C#-ASP.Net MVC AsyncController日志请求处理时间全部内容,希望文章能够帮你解决C#-ASP.Net MVC AsyncController日志请求处理时间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。