2014-02-20 143 views
1

由於我是WCF的新手,這可能是一個基本問題。我甚至不知道這是否得到支持。從代理客戶端將參數傳遞給WCF服務Ctor

我有一個名爲MyCustomService的WCF服務。我說在我的客戶端解決方案這個服務引用,現在我可以通過調用創建一個代理對象:

MyCustomServiceClient myClient = new MyCustomServiceClient(); 
myClient.GetData(); 
myClient.GetData(); 

怎麼,我佈置我的服務,這樣我可以代理實例創建過程中傳遞參數即

MyCustomServiceClient myClient = new MyCustomServiceClient("SomeString"); 

我注意到我創建的每個方法調用都會創建一個MyCustomService的新實例(即,我可以在MyCustomService Ctor上獲得斷點)。因此,我希望創建代理對象(即SomeString)時通過的值可以存在於我所做的所有調用中,直到myClient的生存期爲止。

任何想法?

+0

一個屬性,什麼是你想在構造函數中設置客戶端?您試圖爲每個客戶設置獨特的價值? – Tim

+0

是的。我傳遞的字符串對於每個客戶都是獨一無二的。 –

+0

你最好的選擇就是在米蘭在下面的回答中寫下''InstanceContextMode.PerSession'。您不會在構造函數中設置值,因此您需要在客戶端進行的第一個調用時傳遞它(可以是特定的調用來設置值,也可以檢查是否已在每次調用時設置該值) 。如果您可以提供更多的設計要求,以便您爲此需要/需要這樣做,我們可能會提供更好的答案。 – Tim

回答

-1

即使您嘗試創建這樣的服務,您也會遇到以下錯誤,您不能在WCF服務中使用帶有參數的構造函數。

提供無法加載爲服務,因爲它 沒有默認的(參數)構造函數的服務類型。要修復 問題,請向該類型添加默認構造函數,或將類型爲 的實例傳遞給主機。

現在,如果你想要的數據將持續,你可以設置如下ServiceInstanceContextMode作爲服務類

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service : IService 
+0

這並非完全正確。注意你發佈內容的最後一部分:'或將一個類型的實例傳遞給主機。'你可以使用帶參數的構造函數創建一個服務實例,然後將該實例傳遞給服務主機。儘管這不會解決OP的問題。 – Tim

+0

'你不能在你的WCF服務中使用參數的構造函數是謊言,請參閱http://stackoverflow.com/a/2455039/184746 – caesay

0

Visual Studio(或svcutil.exe)的代理生成功能創建具有五個不同構造函數簽名的代理類。你所問的那個,接受單個字符串的構造函數是非常有用的,因爲它允許你從app.config或Web.config文件中引用不同的客戶端配置。

拿這個極其簡單的假設配置文件:

<configuration> 
    <system.serviceModel> 
    <client> 
     <endpoint name="serverABinding" /> 
     <endpoint name="serverBBinding" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

然後,您可以控制哪些綁定,您使用的代理服務器:

string endpointName = useB ? "serverBBinding" : "serverABinding"; 

var myClient = new MyCustomServiceClient(endpointName); 

當然,我上面顯示的端點綁定太簡單,實際上沒用,但希望你明白。

您的動機並不完全清楚,但它聽起來像您想控制應用程序的所有代理實例中的代理行爲。如果這就是你想要的,那麼不要使用構造函數:在app.config或Web.config文件中使用端點配置來控制代理連接。由Visual Studio生成的默認端點配置使用與代理客戶端的默認名稱匹配的端點名稱。更改此端點定義,您將更改服務客戶端的行爲。

由於您是WCF的新手,我對您的建議是:瞭解所有關於配置文件的知識。一旦你理解了一個WCF配置文件,你就會理解WCF。

相關問題