我需要獲取asp.net MVC的請求處理時間。我使用IHttpModule訂閱onBeginRequest和onEndRequest事件。對於同步控制器來說,它的工作效果很好,但對於異步它會返回錯誤的結果(例如實時約爲2分鐘時爲20ms)。我怎樣才能以通常的方式獲取AsyncController的請求處理時間(不是在ActionAsync/ActionCompleted中爲每個異步操作編寫aditional代碼)?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 -的時間;如果你解釋我的版本錯誤,這將很酷。對不起,我的英語再次感謝。 –
VladK
您將不得不顯示您的代碼,以便我可以解釋您的版本錯誤的原因。目前你還沒有顯示任何代碼,所以我很難告訴你你做錯了什麼。 –
問題更新 – VladK