【问题标题】:Wcf returns data inside DataSet property and returns other properties as nullWcf 在 DataSet 属性中返回数据,并将其他属性返回为 null
【发布时间】:2019-01-09 11:16:57
【问题描述】:

我有 WCF 服务返回以下 DataContract:

[DataContract]
public class Employee
{
    [DataMember]
    public DataSet DS { get; set; }

    [DataMember]
    public string ID { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Email { get; set; }

}

在 GetEmployee 服务中,我返回 Employee 对象,但所有列的值都返回为 null,除了 DS 属性,它包含节点列表中 Employee 属性的值。

public Employee GetEmployee()
    {
            return new Employee
            {
                ID = "76072",
                Name = "name",
                Email = "emp@test.com",
                DS = null
            };
    }

但如果我从 Employee DataContract 中删除 DS 属性,它会正确返回属性内的数据。

我的问题是为什么 WCF 会隐式返回 DataSet 属性中的数据?

【问题讨论】:

    标签: wcf serialization datacontract


    【解决方案1】:

    我不建议使用数据集对象作为要在 WCF 中传递的属性。这对 WCF 来说是一个巨大的负担。虽然这可能无法完全回答您的问题,但 Scott Hanselman 支持我:Returning Datasets in webservices is the Spawn of Satan

    【讨论】:

    • 我知道,但这是一项遗留服务,我不得不与其集成
    【解决方案2】:

    我已经通过分配 new Dataset() 对象而不是 null 来解决它,如下所示:

    public Employee GetEmployee()
    {
            return new Employee
            {
                ID = "76072",
                Name = "name",
                Email = "emp@test.com",
                DS = new DataSet()
            };
    }
    

    现在在 WCF 服务的客户端中,员工的属性被正确映射,而不是在 DS 属性中返回它们。

    【讨论】:

      【解决方案3】:

      我是否误解了您的问题或我在哪里丢失了配置?参考您的步骤,我无法重现您的问题。在我这边。客户端可以正常接收正确的值。我建议您将命名空间添加到数据合同中。
      这是我的demo,希望对你有用。
      Server(IP: 10.157.13.69)

          class Program
          {
              static void Main(string[] args)
              {
                  using (ServiceHost sh = new ServiceHost(typeof(MyService)))
                  {
                      sh.Opened += delegate
                      {
                          Console.WriteLine("service is ready...");
                      };
                      sh.Closed += delegate
                      {
                          Console.WriteLine("Service is closed");
                      };
                      sh.Open();
                      Console.ReadLine();
                      sh.Close();
                  }
              }
          }
          [ServiceContract]
          public interface IService
          {
              [OperationContract]
              Product SayHello();
          } 
          public class MyService : IService
          {
              public Product SayHello()
              {
                  DataTable dt = new DataTable();
                  dt.Columns.Add(new DataColumn("ID", typeof(int)));
                  dt.Columns.Add(new DataColumn("Name", typeof(string)));
                  dt.Rows.Add(10, "Lemon");
                  dt.Rows.Add(11, "Peach");
                  DataSet ds = new DataSet();
                  ds.Tables.Add(dt);
                  return new Product()
                  {
                      Id = 1,
                      Name = "Apple",
                      DS = ds
                  };
              }
          }
      
          [DataContract(Namespace ="MyCorporation")]
           public class Product
          {
              [DataMember]
              public DataSet DS { get; set; }
              [DataMember]
              public int Id { get; set; }
              [DataMember]
              public string Name { get; set; }
      }
      

      App.config(服务器)

      <system.serviceModel>
          <services>
            <service name="Server6.MyService" behaviorConfiguration="mybeh">
              <endpoint address="" binding="basicHttpBinding" contract="Server6.IService" >
              </endpoint>
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
              <host>
                <baseAddresses>
                  <add baseAddress="http://localhost:13060"/>
                </baseAddresses>
              </host>
            </service>
          </services>
          <behaviors>
            <serviceBehaviors>
              <behavior name="mybeh">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"></serviceMetadata>
                <serviceDebug includeExceptionDetailInFaults="true"/>
              </behavior>
            </serviceBehaviors>
          </behaviors>
        </system.serviceModel>
      

      客户。

      class Program
          {
              static void Main(string[] args)
              {
                  ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
                  try
                  {
                      var result = client.SayHello();
                      var r2 = result.DS.Tables[0];
                      Console.WriteLine($"{result.Id},{result.Name}");
                      Console.WriteLine($"{r2.Rows[0][0]},{r2.Rows[0][1]}\n{r2.Rows[1][0]},{r2.Rows[1][1]}");
                  }
                  catch (Exception)
                  {
                      throw;
                  }
      
              }
      }
      

      App.config(客户端)。

          <system.serviceModel>
              <bindings>
                  <basicHttpBinding>
                      <binding name="BasicHttpBinding_IService" />
                  </basicHttpBinding>
              </bindings>
              <client>
                  <endpoint address="http://10.157.13.69:13060/" binding="basicHttpBinding"
                      bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
                      name="BasicHttpBinding_IService" />
              </client>
      </system.serviceModel>
      

      结果。

      如果有什么我可以帮忙的,请随时告诉我。

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 2019-07-17
        • 2018-11-07
        • 1970-01-01
        相关资源
        最近更新 更多