Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过浏览器扩展中的WCF获取自定义对象isn';不是在工作,而是在工作_C#_.net_Wcf_Operationcontract - Fatal编程技术网

C# 通过浏览器扩展中的WCF获取自定义对象isn';不是在工作,而是在工作

C# 通过浏览器扩展中的WCF获取自定义对象isn';不是在工作,而是在工作,c#,.net,wcf,operationcontract,C#,.net,Wcf,Operationcontract,我有一个WCF主机,它具有以下功能: [ServiceContract] public interface IMountToOs { [OperationContract] char GetMountDriveLetter(); [OperationContract] MyTestClass MyTest(); } public class MyTestClass { public string A { get; set; } public s

我有一个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.MyTest().A);
完整的扩展无法工作。但仅当在扩展中使用它时。即使我在扩展的第一行插入Messagebox,它也不会被命中。我不知道为什么。它似乎运行了一个预检查并找到了被拒绝的自定义类的调用。。。 如果我使用winform之类的软件,就没有问题了

.net 3.5

奇怪的是,我有一个转折点和东道主方面的信息。所以我看到这个方法没有被调用

更新 现在,我在扩展的Load方法中移动了wcf调用,并得到一个异常:

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

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

我们看不到这门课 登山客:iMonttoos 所以我们只能假设它是好的

[DataContract] // Missing
public class MyTestClass 
{ 
    [DataMember] // Missing
    public string A { get; set; } 
    [DataMember] // Missing
    public string B { get; set; } 
} 
如果没有这些属性,MountToOsClient无法公开Mytestclass。

根据我的发现和帖子的评论:“要使用客户端通道工厂方法创建动态服务代理,您将需要服务的datacontracts。如果没有datacontracts,但有服务URL,则可以在运行时使用反射创建代理并调用服务方法。”

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

另外,在上面发现了这样的内容:

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

    [OperationContract]
    MyTestClass MyTest();
}

public class MyTestClass
{
    public string A { get; set; }
    public string B { get; set; }
}
何时使用代理?

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

何时使用ChannelFactory

另一个选项是使用ChannelFactory类在客户端和服务之间构建通道,而不需要代理。在某些情况下,您可能拥有与客户机应用程序紧密绑定的服务。在这种情况下,直接引用接口DLL并使用ChannelFactory调用使用该DLL的方法是有意义的。ChannelFactory路由的一个重要优点是,它允许您访问使用svcuti.exe时无法使用的方法

何时使用ChannelFactory vs Proxy类?


如果客户机代码在您的控制之下,并且您希望与客户机共享的不仅仅是服务契约,例如与实体关联的一些实用方法,并使客户机和服务代码的绑定更加紧密,那么DLL将非常有用。如果您知道您的实体不会有太大的变化,并且客户端代码更少,那么DLL将比代理更好地工作。如果您服务的客户端位于系统外部,例如API,那么使用代理是有意义的,因为它通过提供代码文件而不是DLL,使共享契约变得更容易。”

调用proxy.MyTest()时是否收到异常消息.A?不。没有异常。当然,我使用了try-catch和文件进行了尝试。将异常写入文件是ServiceContract IMountToOs和MyTestClass在不同的程序集中吗?如果是,我会检查日志,查看在运行扩展时是否加载了MyTestClass程序集。很抱歉,您错了。由于Framework 3.5,这些属性都不是lo安格尔needed@masterchris_99你能展示一些这样的文档吗?MS()和SO()似乎都指向相反的方向。