0

我有一个像这样的 WCF 主机:

[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);

完整的扩展不起作用。但仅在扩展中使用它时。即使我在扩展的第一行插入一个消息框,它也不会被命中。我不知道为什么。它似乎进行了预检查并找到了被拒绝的自定义类的调用......如果我使用winform左右没有问题。

.net 3.5

奇怪的是,我有一个断点和一个主机端的消息。所以我看到没有调用该方法

现在更新 我在扩展的加载方法中移动了 wcf-call 并得到了一个异常:

System.MissingMethodException:找不到方法:“Contracts.Interfaces.MyTestClass Contracts.Interfaces.IMountToOs.MyTest()”。

我的 winform 测试和此扩展使用相同的接口,因此应该从两者都知道该方法。没有任何合同过时

4

2 回答 2

0

我们看不到类 MountToOsClient: IMountToOs 所以我们只能假设它是好的。

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

没有这些属性,MountToOsClient 无法公开 Mytestclass。

于 2012-08-22T15:42:35.337 回答
0

根据我在这里和帖子评论中找到的内容:“要使用客户端通道工厂方法创建动态服务代理,您将需要服务的数据合同。如果您没有数据合同但您有服务 URL,那么您可以使用反射在运行时创建代理并调用服务方法。”

似乎客户端不知道 MyTestClass 类型,所以我认为您可以使用反射,或者在客户端和服务器之间共享类,或者更简单,使用 datacontract 属性。

另外,在MSDN上发现了类似这样的内容:

"什么时候使用代理?

我们使用 svcutil.exe 创建代理。该工具的输出提供了一个代理类并对应用程序配置文件进行了相应的更改。如果您知道某个服务将被多个应用程序使用,或者其通用性足以在多个地方使用,那么您将希望继续使用生成的代理类。我们在 WCF 中使用代理来与客户端共享服务合同和实体。代理有几个限制,比如他们需要获取和设置,不能暴露构造函数,不能暴露服务契约以外的方法,重复代码,每次我们添加/修改服务契约/数据契约/消息契约时,我们需要为客户端重新生成代理。

何时使用 ChannelFactory

另一种选择是使用 ChannelFactory 类在客户端和服务之间构建一个通道,而不需要代理。在某些情况下,您可能拥有与客户端应用程序紧密绑定的服务。在这种情况下,直接引用接口 DLL 并使用 ChannelFactory 调用您的方法是有意义的。ChannelFactory 路由的一个显着优势是它使您可以访问如果您使用 svcutil.exe 则无法使用的方法。

何时使用 ChannelFactory 与 Proxy 类?

如果客户端代码在您的控制之下,并且您希望与客户端共享的不仅仅是服务合同——例如与实体关联的一些实用方法,并使客户端和服务代码更紧密地绑定,则 DLL 会很有帮助。如果您知道您的实体不会发生太大变化并且客户端代码更少,那么 DLL 将比代理更好地工作。如果您的服务的客户端在系统外部,例如 API,则使用代理是有意义的,因为通过提供代码文件而不是 DLL,它可以更轻松地共享合约。”

于 2012-08-23T08:21:19.687 回答