2014-03-27 19 views
0
創建C#-SoapClient

我們的軟件使用了很多的WebService通過如何自ChannelFactory

sc = new MyServiceSoapClient() 

調用這個構造器讀取 的EndpointAddress和Winword.exe.config 綁定和行爲(這是因爲出來的軟件是WINWORD Addin)

但客戶要求我們不要觸摸Winword.exe.config文件。

所以我們改變了我們的策略,從ChannelFactory 創建一個頻道,因爲在這種情況下我們可以使用任何我們喜歡的「.config」文件。

不幸的是,我們從ChannelFactory獲得的頻道是「MyServiceSoap」,但它不是「MyServiceSoapClient」。

我們不想在創建的頻道做每個Web服務調用 ,因爲這將意味着我們重新實現非常多的電話是這樣的:

創建一個請求對象

調用WebService方法

從響應對象讀取結果。

,所以我們試圖實例化的MyServiceSoapClient這樣:

sc = new MyServiceSoapClient(chfact.Endpoint.Binding, chfact.Endpoint.Address) 

這個工作得很好,我們終於得到了我們的SoapClient的任何「的.config」文件的,我們並沒有根據Winword.exe.config文件。

但由於安全原因,客戶添加了一些行爲到配置文件。

好,肯定的ChannelFactory讀取配置文件的行爲,但沒有像這樣沒有構造:

sc = new MyServiceSoapClient(Binding, Address, Behavior) 

,所以我們無法從現有的MyServiceSoap通道完全有效的MyServiceSoapClient。

如果我們使用它的默認構造函數創建了MyServiceSoapClient,那麼行爲就可以正常工作 - 但這時客戶需要配置Winword.exe.config他拒絕做的事情。

這也是不可能的強制轉換是這樣的:

sc=(MyServiceSoapClient)channel; 

因爲信道是MyServiceSoap接口。

問題:

有什麼方法來創建從MyServiceSoap通道或者從一個的ChannelFactory MyServiceSoapClient?

或者它可以用一些複雜的類型鑄造嗎?

許多在此先感謝

你,傑拉德

回答

0

如果你把所有的WCF的配置在外部文件中,這樣你就不必再次觸碰過winword.exe.config:

<system.serviceModel> 
    <bindings configSource="bindings.config" /> 
    <behaviors configSource="behaviors.config" /> 
    <client configSource="client.config" /> 
    <services configSource="services.config" /> 
    ..... 
</system.serviceModel> 

因此,對於<system.serviceModel>中的每個部分,您可以使用configSource=屬性指定一個外部配置文件(並且不要讓Visual Studio的紅色波浪線混淆它 - 是的,它可以是DO工作!)。

您可以爲任何配置部分做到這一點 - 但不幸的是,有沒有辦法爲整個段組<system.serviceModel>)做到這一點。

(這是從這個答案抄:https://stackoverflow.com/a/1598776/725866

+0

哎呀 - soory,我不太清楚。 實際上客戶根本不想擁有任何Winword.exe.config文件。 –

相關問題