我正在尝试使用 WCF,但我认为我遇到了障碍。我的问题是我可以打电话Add(double,double)
and getPerson()
来自“客户”。但是,我无法调用任何方法Person
目的。我用简单的方法剥离了类。这是我的代码片段,请让我知道我做错了什么。
Server Code
namespace Test.WebSvc{
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Sample")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
Person getPerson();
}
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2) { return n1+n2 ; }
public Person getPerson(){
Person tempPerson = new Person();
return tempPerson;
}
}
[DataContract]
public class Person{
[OperationContractAttribute]
public string toString(){
return "This is a Person Object";
}
Client Code
ServiceRef1.CalculatorClient client = ServiceRef1.CalculatorClient();//works
Console.WriteLine(client.Add(1.0,2.0)); //this too works
ServiceRef1.Person p = client.getPerson(); // this is OK., but is not doing what I wanted it to do
Console.WriteLine(p.toString()); // I do not get "This is Person Object"
我猜测我的 Person 类的声明有问题..但不知道我应该做什么或我缺少什么..
Thanks!
是的,您遇到了障碍 - WCF 是一个基于消息的系统,它只进行交换序列化数据,无论是 XML 还是 JSON,文本或二进制格式。确实如此not然而,传递“完整”.NET 对象及其完整功能,如方法和所有这些(应该如何?它被设计为可互操作,并且我不知道 Ruby 或 PHP 客户端如何调用 .NET 对象上的方法)。
WCF 的设计初衷并不是为了远程访问对象,它只是在客户端和服务器之间传递消息。因此,您可以在 XML 模式中表达的任何内容(原子类型、继承和组合之类的任何内容)都可以序列化并在两方之间发送。
任何东西cannot在 XML 模式中建模 - 如泛型、接口、方法/代码 - 不能在客户端和服务器之间传递。
如果您控制通信的两端并且两者都基于 .NET,则有多种方法和技巧可以解决此问题。基本上,您必须将服务契约和所有数据契约(所有类)放入单独的程序集中,然后从服务器(实现服务契约)和调用契约的客户端引用该程序集。您可以告诉 WCF 重用引用程序集中已存在的类型,在这种情况下,客户端将重用现成的类型Person
从公共共享程序集中创建类(及其所有 .NET 优点),而不是重新创建客户端数据代理。通过这个技巧,您可以让 WCF 通过网络发送序列化消息,而在客户端,您将重新创建一个成熟的 .NET 对象及其所有方法。
再次强调:只要您控制通信的两端,并且两端都使用 .NET,这种方法就非常有效。通过这种方法,任何互操作性都被排除在外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)