2009-10-24 71 views
0

我有一個WCF服務,方法是暴露如下:WCF服務查詢

public interface IService 
{ 
    [OperationContract] 
    bool Read(); 
    [OperationContract] 
    bool Write(); 
} 

public class MyService : IService 
{ 

    //Constructor 

    MyService() 
    { 
     //Initialization 
    } 

    public bool Read() 
    { 
     //Definition 
    } 

    public bool Write() 
    { 
     //Definition 
    } 
} 

我有一個通過URL消耗Web服務的基於桌面的應用程序。 此Web服務可以部署在多個位置,因此用戶可以通過從組合框中選擇一個URL來連接到任何Web服務。

在客戶端應用程序創建動態服務客戶如下所示:

ServiceReference1.DXMyServiceClient _client = null; 

_client = new DXMyServiceClient(); 

_client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url); 

問題 在調試我注意到,每當我調用每個爲MyService的構造函數被調用時(網絡服務的任何方法如果我連接到相同的服務)。

例如像當我這樣做:

_client.Read();//MyService() constructor is called 

_client.Write();//MyService() constructor is called 

問題是我必須再做所有的初始化..想,如果我連接到數據庫,然後我不得不再次建立連接字符串和所有的東西..

這是自然行爲還是我做錯了什麼?

其次, 我想驗證用戶的有效網址(的網絡服務)。如果它連接到有效的網址或不..我通過Ping命令做到這一點.. 這是什麼最好的辦法!

+0

考慮創建第二個關於檢查url是否有效的問題。我不認爲ping命令是好主意,因爲它只測試主機地址並測試icmp協議,而不是tcp。主機可能不響應ping,但這並不意味着它不是有效的url。 – empi 2009-10-24 09:23:23

回答

1

問題在調試,我注意到,每當我每次爲MyService的構造函數被調用 時間調用任何方法 Web服務的(如果我連接到相同的服務)。 問題是我必須再次做所有的初始化.. 如果我連接到數據庫然後我必須再次 建立連接字符串和所有的東西..

是的,這是默認行爲和推薦的行爲。你應該不是依靠你的服務方的任何狀態!這通常不是一個好主意,可能會導致很多問題。

在其推薦的「每次通話」模式,WCF服務有一個ServiceHost的()類的實例上運行,這將偵聽傳入的請求/消息。每次請求進入時,都會創建一個新的服務類實例(實現您的服務合約)來處理請求 - 就像每次在ASP.NET中訪問URL時一樣,您的頁面類也會被實例化以處理請求。

是的,當然 - 這意味着你應該保持你的服務類簡單和精簡,並且而不是做了很多初始化/狀態管理。無論如何,任何需要在服務調用之間保持持久性的東西都應放在持久性存儲中,比如數據庫。

0

問題是我必須再做所有 初始化..想,如果我 連接到數據庫,然後我有 再次構建連接字符串 和所有的東西..

這是自然的行爲還是我 做錯了什麼?

默認情況下,InstanceContextMode設置爲PerSession,併發性設置爲Single。但是,如果您不使用會話,基本上每次調用服務時都會創建新實例。這是所期望的行爲,因爲它被認爲是更具可擴展性的。如果對您有問題,您應該在後續調用之間實施會話,然後爲每個會話您將獲得一個服務實例。

這裏是一個指導如何做到這一點:Using Sessions