我很抱歉提前對長篇文章,因爲我一直在收集診斷,但似乎不能把我的手指放在這個問題上。DbContext/Ninject相關性GetService緩慢SingleOrDefault負載測試
EF6 /網絡API 2
首先,我注意到一個緩慢運行的端點和負荷下測試得到的更糟。
代碼:
//configuration
kernel.Bind<T>()
.To<T>()
.InTransientScope()
//Caller elsewhere in code base
public http.IDependencyScope BeginScope()
{
return new NinjectScope(_kernel.BeginBlock());
}
public class NinjectScope : IDependencyScope
{
public object GetService(Type serviceType)
{
Debug.WriteLine("COREIOC_Enter GetService Timein: {0}", DateTime.Now.ToLongTimeString());
Stopwatch coreIOC = new Stopwatch();
coreIOC.Start();
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
Debug.WriteLine(string.Format("COREIOC_Complete CreateRequest Elapsed: {0}", coreIOC.Elapsed));
var abc = resolutionRoot.Resolve(request);
Debug.WriteLine(string.Format("COREIOC_Resolve Elapsed: {0}", coreIOC.Elapsed));
var xyz = abc.SingleOrDefault();
Debug.WriteLine(string.Format("COREIOC_SingleDef Resolve Elapsed: {0}", coreIOC.Elapsed));
coreIOC.Stop();
Debug.WriteLine(string.Format("COREIOC_Exit Elapsed: {0}", coreIOC.Elapsed));
return xyz;
}
}
調試輸出:(注意SingleDef是4秒)
COREIOC_Enter GetService Timein: 7:15:56 AM:
COREIOC_Complete CreateRequest Elapsed: 00:00:00.0008914
COREIOC_Resolve Elapsed: 00:00:00.0032197
COREIOC_SingleDef Resolve Elapsed: 00:00:04.4787988
COREIOC_Exit Elapsed: 00:00:04.4803695
有趣的後續調用顯示此 「旋轉起來」 的時間消失了
COREIOC_Enter GetService Timein: 7:27:08 AM:
COREIOC_Complete CreateRequest Elapsed: 00:00:00.0000266
COREIOC_Resolve Elapsed: 00:00:00.0018957
COREIOC_SingleDef Resolve Elapsed: 00:00:00.0307401
COREIOC_Exit Elapsed: 00:00:00.0354408
所以這將是一個打開和關閉的情況下除非下一個負載測試中的端點表示EVERY呼叫4秒的延遲。 (例如同時250試運行將顯示每個人服用4+秒)。
手寫負載測試代碼:
public override IEnumerator<WebTestRequest> GetRequestEnumerator()
{
WebTestRequest request6 = new WebTestRequest("http://localhost:57874/api/acts/10553697");
request6.Timeout = 120;
request6.Method = "GET";
request6.Headers.Add(new WebTestRequestHeader("Authorization", "Bearer h0aHdT6..."));
request6.Headers.Add(new WebTestRequestHeader("Accept","application/..."));
request6.Headers.Add(new WebTestRequestHeader("ContentType", "application/json"));
request6.ValidateResponse += new EventHandler<ValidationEventArgs>(request6_ValidateResponse);
yield return request6;
request6 = null;
}
所以
- 是我的負載測試不正確或,
- 我的EF 6的設置不正確或,
- 是我的對象重用不正確的,或者
- 是有proble m與我實際使用SingleOrDefault?
我一直在通過ninject實例化的對象的構造函數,並沒有看到它們導致延遲。
我的確遇到過SO post,作爲一名PluralSight粉絲,我能夠立即訪問課程。然而,這是一個七小時的課程,最後我不確定這是EF造成延誤。