Мне нужно получить время обработки запроса для asp.net MVC. Я использую IHttpModule для подписки на события onBeginRequest и onEndRequest. Для контроллеров синхронизации он отлично работает, но для async он возвращает неверный результат (например, 20 мс, когда в реальном времени было около 2 мин). Как я могу получить время обработки запроса для AsyncController вообще (не писать дополнительный код в ActionAsync/ActionCompleted для каждого асинхронного действия)?Время обработки запроса журнала ASP.Net MVC AsyncController
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; }
}
}
Спасибо! Оно работает. В моей версии я поставил DateTime.Now в контексте onBeginRequest и onEndRequest elapsedTime = Datetime.Now - <время из onRequestBegin>; Это будет здорово, если вы объясните, что моя версия неверна. Извините за мой английский и еще раз спасибо. – VladK
Вам нужно будет показать свой код, чтобы я мог объяснить, почему ваша версия неверна. В настоящее время у вас нет кода, поэтому мне сложно рассказать вам, что вы делаете неправильно. –
Вопрос Обновлено – VladK