Je dois obtenir le temps de traitement des demandes pour asp.net MVC. J'utilise l'abonnement IHttpModule pour les événements onBeginRequest et onEndRequest. Pour les contrôleurs de synchro, cela fonctionne très bien mais pour async il renvoie un mauvais résultat (par exemple 20ms quand le temps réel était d'environ 2min). Comment puis-je obtenir le temps de traitement des demandes pour AsyncController de manière générale (ne pas écrire de code supplémentaire dans ActionAsync/ActionCompleted pour chaque action asynchrone)?Temps de traitement de la demande de journal 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; }
}
}
Merci! Ça marche. Dans ma version, j'ai mis DateTime.Now en contexte onBeginRequest et onEndRequest elapsedTime = Datetime.Now -
Vous devrez montrer votre code pour que je puisse expliquer pourquoi votre version est erronée. Actuellement, vous n'avez montré aucun code, il est donc difficile pour moi de vous dire ce que vous faites mal. –
Question Mise à jour – VladK