我很抱歉提前对长篇文章,因为我一直在收集诊断,但似乎不能把我的手指放在这个问题上。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造成延误。