2011-07-21 74 views
0

從ASP.NET應用程序訪問WCF Web服務的最佳做法是什麼?目前,在每一頁我需要訪問我有一個字段ASP.NET應用程序中的WCF客戶端

private readonly _serviceClient = new WCFServiceClient(); 

和訪問它的方法多次,關閉它在每次調用並創建一個新實例的服務,每次它的狀態Faulted。但是,我不知道我是否應該這樣做,或者相反,每個方法調用創建一個新的實例。有關這方面的最佳做法是什麼?

+0

您需要確保正確處理WCFClient。請查看以下文章http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx – RubbleFord

回答

1

我已經做了類似於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,順便說一句。

2

結帳Wenlong's blog。從.NET 3.5 Service Pack 1開始,客戶端代理擴展ClientBase共享一個靜態ChannelFactory實例緩存的應用程序域範圍。

從我測試和實驗中,ChannelFactory和Channel的創建是wcf調用初始化中最耗費資源的部分。通過使用「生成的代理」,並且如果您使用某個運行時> .NET 3.5 Service Pack 1,則您已經完成了ChannelFactory部分。我已經看到,當您的服務合同變得更大(更多的方法,更多的類型,更多的參數等)時,渠道的創建更加困難。因此,我建議你保持你的服務合同在某種程度上緊湊。

所以基本上如果你使用生成的代理,我不認爲緩存/共享會給你一個性能改善。

對於在單個代碼塊中對相同服務的連續調用,最好使用相同的服務代理實例。每次打電話並不是最好的主意。

1

您可以在整個應用程序中使用服務清單的單個實例。如果你正在使用依賴注入,那麼像Unity或Spring.Net這樣的IoC框架將允許你將客戶端配置爲容器內的Singleton實例。您不必編寫單獨的代碼來創建Singleton實例。

相關問題