從ASP.NET應用程序訪問WCF Web服務的最佳做法是什麼?目前,在每一頁我需要訪問我有一個字段ASP.NET應用程序中的WCF客戶端
private readonly _serviceClient = new WCFServiceClient();
和訪問它的方法多次,關閉它在每次調用並創建一個新實例的服務,每次它的狀態Faulted
。但是,我不知道我是否應該這樣做,或者相反,每個方法調用創建一個新的實例。有關這方面的最佳做法是什麼?
從ASP.NET應用程序訪問WCF Web服務的最佳做法是什麼?目前,在每一頁我需要訪問我有一個字段ASP.NET應用程序中的WCF客戶端
private readonly _serviceClient = new WCFServiceClient();
和訪問它的方法多次,關閉它在每次調用並創建一個新實例的服務,每次它的狀態Faulted
。但是,我不知道我是否應該這樣做,或者相反,每個方法調用創建一個新的實例。有關這方面的最佳做法是什麼?
我已經做了類似於RubbleFord鏈接到他的評論中的文章,但由於我正在處理多個服務,我使用ChannelFactory並在初始創建時緩存返回的對象。然後我會根據需要創建新頻道,使用它們,然後根據需要關閉/中止。輔助方法是在一個單獨的DLL(我將使用常見的例子):
// bindingName refers to the Web.config binding section's name
public static T GetFactoryChannel<T>(string address, string bindingName)
{
string key = typeof(T).Name;
// OpenChannels is a property that refers to a Dictionary<string, object> holding the key and the channel factory
if (!OpenChannels.ContainsKey(key))
{
ChannelFactory<T> factory = new ChannelFactory<T>();
factory.Endpoint.Address = new EndpointAddress(new System.Uri(address));
factory.Endpoint.Binding = new NetTcpBinding(bindingName);
OpenChannels.Add(key, factory);
}
T channel = ((ChannelFactory<T>)OpenChannels[key]).CreateChannel();
((IClientChannel(channel)).Open();
return channel;
}
在我的客戶端代碼,我會做這樣的事情(由共同的輔助方法):
IMyContract myContract = Common.GetChannelFactory<IMyContract>("net.tcp://someaddress/service", "MyNetTcpBinding");
myContract.SomeMethod();
Common.CloseChannel(myContract); // handles the necessary work to close or abort the channel.
我基於一年前發佈在網絡上的一些文章開發了這個功能,當時我第一次開始使用WCF,它爲我提供了很好的服務。存儲OpenChannels字典對象(在我的情況下,由於AppDomain的大部分WCF服務都是WCF庫),所以我只需要在給定應用程序的生命週期中創建一次每個通道工廠。
您可以根據需要向GetFactoryChannel方法添加任何必需的邏輯(例如,憑據或不同類型的綁定)。我還應該注意到,我沒有向項目添加服務引用,但使用svcutil生成的代理文件。這是在3.5,順便說一句。
結帳Wenlong's blog。從.NET 3.5 Service Pack 1開始,客戶端代理擴展ClientBase共享一個靜態ChannelFactory實例緩存的應用程序域範圍。
從我測試和實驗中,ChannelFactory和Channel的創建是wcf調用初始化中最耗費資源的部分。通過使用「生成的代理」,並且如果您使用某個運行時> .NET 3.5 Service Pack 1,則您已經完成了ChannelFactory部分。我已經看到,當您的服務合同變得更大(更多的方法,更多的類型,更多的參數等)時,渠道的創建更加困難。因此,我建議你保持你的服務合同在某種程度上緊湊。
所以基本上如果你使用生成的代理,我不認爲緩存/共享會給你一個性能改善。
對於在單個代碼塊中對相同服務的連續調用,最好使用相同的服務代理實例。每次打電話並不是最好的主意。
您可以在整個應用程序中使用服務清單的單個實例。如果你正在使用依賴注入,那麼像Unity或Spring.Net這樣的IoC框架將允許你將客戶端配置爲容器內的Singleton實例。您不必編寫單獨的代碼來創建Singleton實例。
您需要確保正確處理WCFClient。請查看以下文章http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx – RubbleFord