我有一个带有2个端点的WCF服务,使用在Azure中的实例上运行的BasicHttpBinding。当第一次调用服务时,响应需要13-16秒(这是预期的),后续请求在150ms到1000ms之间就足够了,具体取决于请求类型(我使用soapUI进行测试)。 / p>
但是,如果我没有发送几分钟(少于4或5 分钟)的任何请求,则服务实例似乎不会被重复使用,因为它是只要第一次请求超过13秒就可以了。
我在ServiceBehavior中尝试过“InstanceContextMode = InstanceContextMode.Single”,但这并没有解决问题。
在跟踪中,只要服务响应缓慢,我就可以看到线程ID更改。
我还记录了从命中Application_BeginRequest到客户端调用方法的开始的时间,这似乎是这些“慢”调用期间的最大延迟。 我有一些相当大的类代表业务接口,我正在使用Entity Framework来运行Azure VM上的MySQL数据库。 (虽然我认为这不一定是Azure问题。)
无论是调用链接到数据库操作的复杂消息类型还是仅调用简单的“Hello World”响应,响应速度都相同。
即使需要新的服务实例,在IIS重新启动或应用程序池回收后,只要初始加载需要吗?
使用Static类的包装器做一些神奇的帮助吗? (我在想)。
使用C#4.0 / VS2010 Professional构建
答案 0 :(得分:2)
可能有很多原因导致这种情况发生。我建议你从WCF服务中的一些tracing开始。
使用 TraceSource :
在您的应用中添加一些日志记录private TraceSource ts = new TraceSource("MyApp");
public string GetData(int value)
{
ts.TraceInformation("GetData called with {0}", value);
return string.Format("You entered: {0}", value);
}
在web.config中配置TraceSource以及System.ServiceModel源。
<system.diagnostics>
<sources>
<source name="MyApp" switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel" switchValue="All" propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="Logs.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="xml" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>