gpt4 book ai didi

WCF 将对象返回给客户端

转载 作者:行者123 更新时间:2023-12-04 09:37:52 24 4
gpt4 key购买 nike

我正在尝试使用 WCF,但我想我遇到了障碍。我的问题是我可以调用Add(double,double)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 类的声明出了点问题.. 但是我应该知道我应该做什么或我缺少什么..

谢谢!

最佳答案

是的,你遇到了障碍 - WCF 是一个基于消息的系统,它只交换 序列化数据 ,可以是 XML 或 JSON,采用文本或二进制格式。它确实 不是 但是传递“完整的” .NET 对象及其完整的功能,如方法和所有这些(应该怎么做??它被设计为 可互操作的 ,我看不出 Ruby 或 PHP 客户端如何调用.NET 对象上的方法)。

WCF 并非旨在使远程访问对象成为可能 - 它只是在客户端和服务器之间传递消息。因此,您可以在 XML 模式中表达的任何内容(原子类型、继承和组合之类的任何内容)都可以在双方之间进行序列化和发送。

任何 不能在 XML 模式中建模 - 如泛型、接口(interface)、方法/代码 - 不能在客户端和服务器之间传递。

如果您控制通信的两端并且它们都是基于 .NET 的,则有解决此问题的方法和技巧。基本上,您必须将服务契约(Contract)和所有数据契约(Contract)(所有类)放入一个单独的程序集中,然后从服务器(实现服务契约(Contract))和调用契约(Contract)的客户端引用该程序集。您可以告诉 WCF 重用引用程序集中已经存在的类型,在这种情况下,客户端将重用现成的 Person类(具有所有 .NET 优点),而不是重新创建客户端数据代理。使用这个技巧,您可以让 WCF 通过网络发送序列化消息,但在客户端,您正在重新创建一个完整的 .NET 对象及其所有方法。

再说一遍:只要您控制通信的两端,并且两端都使用 .NET,这将非常有效。使用这种方法,任何互操作性都是不可能的。

关于WCF 将对象返回给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com