2012-01-19 68 views
0

我正在連接到第三方API。他們向我提供了一個我通過使用Web引用添加的WSDL文件。是否可以通過SOAP連接並通過同一連接發送多個消息?SOAP連接WCF

我已經從代理類創建客戶端,但似乎沒有Open()或Close()方法。調用方法時,客戶端是否連接並斷開連接?

SampleService client = new SampleService 

client.SampleMethod(); 

編輯:

我添加了一個 「服務引用」 從WSDL文件。客戶端由WSDL文件中的「PortType」構建。有一個Close()或一個Abort()方法。 SampleService.client上唯一的方法是SampleMethod()

+0

請接受答案,或者如果您自己回答問題,請添加並接受新答案。 –

回答

1

他們向我提供了一個我通過使用web引用添加的WSDL文件。

在這種情況下,您並未使用WCF,而是使用ASP.NET WebServices客戶端。在你的情況下,它可能不是一個很大的區別,但ASP.NET WebServices主要是爲了將舊版代碼移植到新版本的.NET框架時的向後兼容性。今天,你應該使用添加服務引用來使用WCF,正如其他的推薦。

SOAP連接WCF

有沒有像SOAP連接。 SOAP是通過某種傳輸協議隧道傳輸的應用程序協議。在你的情況下,傳輸協議是HTTP。

我創建從代理類的客戶端,但有沒有 似乎是一個打開()或關閉()方法。當一個方法被調用時,客戶端是否連接並且斷開連接?

您無需致電OpenClose。這一切都是在低層的通信棧中處理的。默認情況下,所有HTTP客戶端應用程序都使用稱爲持久連接的東西這意味着當您第一次訪問某個主機時,您的客戶端計算機和承載目標資源的服務器之間建立了TCP連接。隨後的調用重用相同的連接。如果連接在一段預定義的時間內沒有被使用(客戶端和服務器可以有不同的超時時間),連接就會關閉,下一次客戶端想要調用服務器時,它會創建一個新的連接(同樣,您不需要打擾有了這個)。

因此,在應用程序中調用SOAP代理的方法可以在沒有人存在的情況下自動打開連接。您不需要顯式關閉連接,但應該處置代理以釋放其資源。連接本身可以在代理被處置後生存,並且可以被另一個代理重用。

+0

感謝您的回覆。你在其他帖子上幫了我很多!我不確定你的意思是通過處理代理但保持連接打開。你能提供一個例子嗎? – ministrymason

+0

很久以前,當我玩這個時,我發現配置代理實際上並沒有關閉連接,因爲連接可以被其他代理重用 - 這些都是在內部處理的。所有打開的連接在超時(未使用一段時間)或關閉應用程序後都會關閉。單個主機的打開連接數量也有限制。 –

0

您應該添加服務引用(WCF),而不是使用過時的Web引用。

然後按下面的模式:

try 
{ 
    SampleServiceClient client = new SampleServiceClient(); 
    client.SampleMethod(); 
    //... Make as many calls to as many methods as you like. 
    client.SampleMethod(); 
    client.Close(); 
} 
catch (Exception e) 
{ 
    //client is unusable once an exception occurs. 
    ... 
    client.Abort(); 
    throw; 
} 
+0

如果我添加「服務引用」,則唯一可用的方法是第三方服務公開的方法。有一個Close或Abort方法。客戶端是從WSDL文件中的「PortType」構造的? – ministrymason

+0

其實它是因爲我從接口而不是類創建客戶端。 ISampleServiceClient client = new SampleServiceClient();爲什麼這些方法不在界面上? – ministrymason

+0

@ministrymason - ISampleServiceClient是由您的第三方朋友定義的自定義界面,不是由Mircosoft或WCF定義的。主機服務器必須實現Open()和Close()纔是愚蠢的,因爲它們只對客戶端有用。你有道理, –

0

您需要使用添加服務引用,而不是添加Web引用。一旦添加,您可以調用服務如圖所示:

using(SampleServiceClient client = new SampleServiceClient()) 
{ 
    var response = client.SampleMethod(); 
} 

希望有所幫助。