我有一個WCF服務,需要5分鐘才能從數據庫加載所有內容。我想從WCF中獲得最好的性能,並且發現這篇文章http://theburningmonk.com/2010/05/wcf-improve-performance-with-greater-concurrency/ 它聲明我將使用PerCall獲得更好的性能。我有每秒2000到4000點擊的地方。將InstanceContextMode.Single轉換爲InstanceContextMode.PerCall
我的問題是加載數據需要很長時間。每篇文章都說使用靜態變量爲真正的服務創建一個包裝器。 我不知道這是怎麼樣,我不知道什麼_container真的是。 有人可以給我一個完整的例子嗎?
在初始化步驟是漫長的和不可避免的,或者你的類需要在構造函數中的一些參數(例如,當您以編程方式託管服務從IoC容器中檢索)的參數的構造函數可以成爲案件問題。爲了解決這個問題,你可以爲你的類的包裝和揭露包裝的服務,而不是,但保持其所有的請求被傳遞到底層服務的靜態實例:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyServiceWrapper : IMyServiceWrapper
{
// get the underlying service from the container
private static IMyService MyService = _container.Resolve<IMyService>();
public MyServiceWrapper()
{
// parameterless constructor which does nothing, so easy to constructor
}
public void DoSomething()
{
MyService.DoSomething();
}
}
// dummy interface to ensure the wrapper has the same methods as the underlying service
// but helps to avoid confusion
public interface IMyServiceWrapper : IMyService
{
}
對於sessionful的服務,PerSession實例上下文模式使 你PerCall實例上下文模式,並在 同時所有的好處減少你付了前開銷tra併發性 ,因爲您的類的新實例不再爲每個 請求創建,而是爲每個會話創建。
我_container這裏猜測是IOC容器,代碼行正試圖解決的IMyService實例。如果您不使用IOC容器,則可以返回服務的實例。 –
所以所有的包裝的東西可以忽略,我可以做到這一點? [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall, AddressFilterMode = AddressFilterMode.Any)] 公共類撥號方案:IDialPlan { 內部靜態SonicSBCRouting S = NULL; public DialPlan() { Start(); } 公共無效啓動() {如果(一個或多個== NULL) S =新SonicSBCRouting(); s.Startup(); } –