2012-08-14 45 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

相关问题