2012-08-14 44 views
0

我有一個WCF主機像這樣的東西:獲取自定義對象在資源管理器擴展無法正常工作,但在winform

[ServiceContract] 
public interface IMountToOs 
{ 
    [OperationContract] 
    char GetMountDriveLetter(); 

    [OperationContract] 
    MyTestClass MyTest(); 
} 

public class MyTestClass 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

客戶

private IMountToOs _proxy; 
    public IMountToOs Proxy 
    { 
     get 
     { 
      if (_proxy == null) 
      { 
       NetTcpBinding binding = new NetTcpBinding(); 
       binding.MaxReceivedMessageSize = 2147483647; 
       binding.OpenTimeout = TimeSpan.FromMilliseconds(50000); 
       EndpointAddress address = new EndpointAddress("net.tcp://localhost:1234/MountToOsHost"); 
       //_proxy = new MountToOsClient(binding, address); 
       ChannelFactory<IMountToOs> factory = new ChannelFactory<IMountToOs>(binding); 
       _proxy = factory.CreateChannel(address); 
      } 

      return _proxy; 
     } 
    } 

雖然我可以訪問

MessageBox.Show("Okay - " + Proxy.GetMountDriveLetter()); 

我不能調用這個方法:

MessageBox.Show("Okay - " + Proxy.MyTest().A); 

完整的擴展無法正常工作。但只在擴展中使用它。即使我在擴展的第一行插入Messagebox,它也不會被打中。我不知道爲什麼。它似乎運行預檢查,並找到被拒絕的自定義類的電話或... 如果我使用的WinForm或這樣沒有問題。

.net 3.5

好奇的是,我有一個斷點和主機側的消息。因此,我認爲,該方法不叫

現在更新 我感動在擴展的Load方法的WCF呼叫並獲得了異常:

system.missingMethodException而:找不到方法: 「Contracts.Interfaces.MyTestClass Contracts.Interfaces.IMountToOs.MyTest()」。

我的winform測試和這個擴展使用相同的接口,以便該方法應該從兩者都知道。沒有合同或以上已經過時

+0

您是否感到懷疑當你調用Proxy.MyTest()。一個? – user957902 2012-08-14 11:50:38

+0

沒有,沒有例外,當然我試着用一個try catch和一個文件的異常的File.Write – 2012-08-14 11:54:57

+0

ServiceContract IMountToOs和MyTestClass是不同的程序集?如果是這樣,我會檢查[Fusion](http://msdn.microsoft.com/en-us/library/e74a18c4(v = vs.100).aspx)日誌以查看運行擴展時MyTestClass程序集是否被加載。 – Simon 2012-08-22 00:35:32

回答

0

根據我發現的here以及該帖子的評論:「對於使用客戶端通道工廠方法創建動態服務代理,您將需要服務的數據合同。如果您沒有數據合同但您擁有該服務URL,那麼你可以使用反射來在運行時創建代理並調用服務方法。「

似乎MyTestClass類型在客戶端是不知道的,所以我認爲你可以使用反射,或者在客戶端和服務器之間共享類,或者更簡單一點,使用datacontract屬性。

此外,發現了一些在MSDN說像這樣:

當使用代理

我們使用svcutil.exe的代理創建此工具的輸出提供了一個代理類。並對應用程序配置文件進行相應的更改。如果你有一個你知道的服務將被多個應用程序使用,或者通用性足以在幾個地方使用,那麼你會想繼續使用生成的代理類。我們在WCF中使用代理以便能夠與客戶端共享服務合同和實體。代理有幾個限制,比如它們需要獲取和設置,構造函數不能被公開,服務合約以外的方法不能被暴露,重複代碼,每當我們添加/修改服務合同/數據合同/消息合同時,我們需要重新生成客戶端的代理。

何時使用的ChannelFactory

另一種選擇是使用的ChannelFactory類構建客戶端和服務之間的信道,而不需要一個代理的。在某些情況下,您可能擁有與客戶端應用程序緊密綁定的服務。在這種情況下,直接引用接口DLL並使用ChannelFactory來調用您的方法是有意義的。 ChannelFactory路由的一個顯着優點是,它使您可以訪問如果您使用svcutil.exe時無法訪問的方法。

何時使用ChannelFactory與Proxy類?

DLL是有益的,如果客戶端代碼是在你控制,你想不只是與客戶端的服務合同,以分享更多 - 比如與實體相關的一些實用方法,使客戶&服務代碼更緊密地綁定。如果你知道你的實體變化不大,客戶端代碼更少,那麼DLL會比代理更好。如果您的服務的客戶端在系統外部(如API),則使用代理服務器是有意義的,因爲它通過提供代碼文件而非DLL來共享合同變得更加簡單。「

0

我們看不到類 MountToOsClient:IMountToOs 所以我們只能假設它沒問題。

[DataContract] // Missing 
public class MyTestClass 
{ 
    [DataMember] // Missing 
    public string A { get; set; } 
    [DataMember] // Missing 
    public string B { get; set; } 
} 

如果沒有這些屬性,MountToOsClient無法公開Mytestclass。

+0

抱歉,你錯了從Framework 3.5開始,這些屬性不再需要 – 2012-08-22 19:20:52

+0

@ masterchris_99你可以顯示某種文檔來說明這種效果嗎?MS(http://msdn.microsoft.c om/en-us/library/ms733127%28v = vs.110%29.aspx)and SO(http://stackoverflow.com/questions/1076480/wcf-to-use-datacontract-or-not-with-net -3-5-sp1)似乎指向相反的方向。 – devstruck 2012-08-22 20:29:16

+0

@post_erasmus http://stackoverflow.com/a/11264753/453798 – Geek 2014-01-06 15:22:13

相關問題