【问题标题】:WCF returning Objects to ClientWCF 将对象返回给客户端
【发布时间】:2011-05-05 23:02:11
【问题描述】:

我正在尝试使用 WCF,但我想我遇到了障碍。我的问题是我可以从“客户端”调用Add(double,double)getPerson()。但是,我无法调用 Person 对象的任何方法。我已经用裸方法剥离了这些类。这是我的代码 sn-ps,请让我知道我做错了什么..

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 web-services serialization object


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您将两个概念与您的 Person 类型混为一谈——您所做的将不起作用。

      您已在 Person 类型上添加了 DataContract 属性。这是正确的,因为您有一个返回 Person 的服务。 Person 对象将被序列化并返回给您的服务客户端(在本例中为CalculatorClient)。

      你应该像这样定义Person

      [DataContract]
      public class Person
      {
          [DataMember]
          public string Description { get; set; }
      }
      

      在您的计算器服务中:

      public Person getPerson()
      { 
          Person tempPerson = new Person();
          tempPerson.Description = "This is a Person Object";
          return tempPerson; 
      }
      

      这是因为您的Person 对象的工作是保存数据,并将其从服务器传送到客户端。定义方法/操作不是它的工作,而是应该在您的服务类中完成(例如CalculatorService)。添加OperationContract 属性并不会神奇地将数据传输对象转变为服务。

      【讨论】:

      • 我花了一分钟才弄清楚 DataContract 不是 ServiceModel 命名空间的一部分。它在 System.Runtime.Serialization 中,您还需要在项目中添加对它的引用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多