C# 通过浏览器扩展中的WCF获取自定义对象isn';不是在工作,而是在工作
我有一个WCF主机,它具有以下功能: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
[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()似乎都指向相反的方向。