2009-12-14 107 views
0

我正在编写调用webmethod的客户端程序,但是当我得到返回数据时,某些字段和对象上缺少值。C#webservice在返回时丢失数据

该webmethod依次调用WCF方法,并在WCF方法返回数据是好的。但是当它传递给web服务时,返回数据丢失了。

有什么办法解决这个问题吗?


这是我的客户端代码调用Web服务:

ReLocationDoc query = new ReLocationDoc(); 

    query.PerformerSiteId = 1; 
    query.PerformerUserId = 1; 
    query.FromStatus = 10; 
    query.ToStatus = 200; 

    ReLocationDoc doc = new ReLocationDoc(); 

    ServiceReference1.QPSoapClient service = new QPSoapClient(); 
    try { 
     service.GetRelocationAssignment(query, out doc); 

     string test = doc.Assignment.Id.ToString(); 

    } catch(Exception ex) { 

     MessageBox.Show(ex.Message); 
    } 

将WebMethod代码是在这里:

 [WebMethod] 
     return m_reLocationClient.GetRelocationAssignment(query, out reLocationDoc); 
    } 

,最后的WCF代码:

public ReLocationResult GetRelocationAssignment(ReLocationDoc query, out ReLocationDoc reLocationDoc) { 
     try { 
      LOGGER.Trace("Enter GetRelocationAssignment()."); 

      ReLocationResult result = reLocationCompactServiceClient.GetRelocationAssignment(out reLocationDoc, query); 

      if(reLocationDoc.Assignment == null || reLocationDoc.Assignment.CurrentStatus == STATUS_FINISHED) { 
       ReLocationDoc newQuery = new ReLocationDoc(); 
       newQuery.Assignment = new AssignmentDoc(); 
       newQuery.Assignment.EAN = DateTime.Today.ToString(); 
       newQuery.PerformerSiteId = QPSITE; 
       newQuery.PerformerUserId = QPUSER; 
       reLocationDoc.AssignmentStatus = m_settings.ReadyStatus; ; 
       result = reLocationCompactServiceClient.CreateReLocationAssignment(out reLocationDoc, newQuery); 
      } 

      return result; 

     } finally { 
      LOGGER.Trace("Exit GetRelocationAssignment()."); 
     } 
    } 

GetRelocationAssignment:

public ReLocationResult GetRelocationAssignment(ReLocationDoc query, out ReLocationDoc reLocationDoc) { 
     try { 
      LOGGER.Trace("Enter GetRelocationAssignment()."); 

      ReLocationDoc doc = new ReLocationDoc(); 
      ReLocationResult result = new ReLocationResult(); 

      new Database(Connection).Execute(delegate(DBDataContext db) { 

       User user = GetVerifiedUser(db, query, MODULE_ID); 
       SiteModule siteModule = SiteModule.Get(db, query.PerformerSiteId, MODULE_ID); 

       Status status = Status.Get(db, query.FromStatus, query.ToStatus, 0); 
       Status startStatus = Status.Get(db, query.FromStatus, 0); 
       Status endStatus = Status.Get(db, query.ToStatus, 0); 

       IQueryable<Assignment> assignments = Assignment.GetAssignmentsWithEndStatus(db, siteModule, endStatus); 
       assignments = Assignment.FilterAssignmentStartStatus(assignments, startStatus); 

       foreach(Assignment assignment in assignments) { 

        LOGGER.Debug("Handling assignment: " + assignment.Id); 

        result.Status = true; 
        AssignmentDoc assignmentDoc = FillAssignmentDoc(assignment); 
        //ReLocationDoc doc = new ReLocationDoc(); 

        AssignmentStatus sts = assignment.AssignmentStatus.OrderByDescending(ass => ass.Id).First(); 
        assignmentDoc.CurrentStatus = sts.Status.Zone; 

        Status currentStatus = sts.Status; 

        IList<Item> items = assignment.Items.ToList(); 
        IList<ItemDoc> itemDocs = new List<ItemDoc>(); 
        foreach(Item item in items) { 

         ItemDoc itemDoc = FillItemDoc(item); 

         ItemDetail itemDetail; 
         if(ItemDetail.TryGet(db, item.Id, out itemDetail)) { 
          ItemDetailDoc itemDetailDoc = FillItemDetailDoc(itemDetail); 
          itemDoc.Details = new ItemDetailDoc[1]; 


          Event eEvent = null; 
          if(Event.GetEvent(db, itemDetail, currentStatus, out eEvent)) { 
           EventDoc eventDoc = FillEventDoc(eEvent); 
           itemDetailDoc.Events = new EventDoc[1]; 

           if(eEvent.LocationId.HasValue) { 
            Location location = null; 
            if(Location.TryGet(db, eEvent.LocationId.Value, out location)) { 
             eventDoc.Location = new LocationDoc(); 
             eventDoc.Location = FillLocationDoc(location, db); 
            } 
           } 
           itemDetailDoc.Events[0] = eventDoc; 
          } 
          itemDoc.Details[0] = itemDetailDoc; 
         } 
         itemDocs.Add(itemDoc); 
        } 
        assignmentDoc.Items = itemDocs.ToArray(); 
        doc.Assignment = assignmentDoc; 
       } 

      }, delegate(Exception e) { 
       result.Message = e.Message; 
      }); 

      reLocationDoc = doc; 
      return result; 

     } finally { 
      LOGGER.Trace("Exit GetRelocationAssignment()."); 
     } 
    } 

在所有这些代码中返回数据是好的。只有在传递给webmetod时才会丢失数据。

在此处输入代码。

回答

1

此外,消息中的XML标记的顺序,使差异 - 两年前,我有大约或许有类似的问题,在这种情况下,参数值分别为传输过程中dissappearing因为发送部分下令标签不同于模式中定义了什么。

+0

...和WCF用于服务器端定义Web服务。 – 2009-12-14 08:38:48

+0

是的wcf用于定义web服务。你是如何解决这个问题的? – Tan 2009-12-14 08:45:39

+0

在我们的示例中,通过让调用者/客户端更改其实现以遵守WCF服务架构中定义的消息元素(XML标记)的顺序来解决错误。 – 2009-12-15 08:37:15

1

确保在任何一端都使用相同的套管来访问XML标签。如果外壳不一样,那么该值将不被读取。

+0

你的意思是webreference下的XML文件? – Tan 2009-12-14 08:41:55

+0

不,你的服务返回的xml。它返回一个包含XML的字符串? – 2009-12-14 08:47:47

+0

两端没有相同的铸件。 – Tan 2009-12-14 09:14:28

1

您应该检查所有消息是从您的web服务发送回来的。手动调用您的webservice并检查其响应。

  • 如果所有数据都存在,可能是您的webservice引用已过时;通过右键单击您的web服务参考并选择“更新”来更新它
  • 如果您的数据没有回来,您的问题可能与web服务代码有关。 您应该再次检查序列化代码(如果有),并确保所有返回的类型为 [Serializable] 。您应该检查所有返回类型是否为public,因为它是序列化的必需条件。

正如John Saunders所述,[Serializable]不被XmlSerializer使用。

+0

我的webmethod只是这样的 [WebMethod] public ReLocationResult GetItemInfo(ReLocationDoc query,out ReLocationDoc reLocationDoc){返回m_reLocationClient.GetItemInfo(query,out reLocationDoc); } 当iam在wcf调试时所有返回的数据都没有问题。当它返回到webmethod时。数据丢失。 – Tan 2009-12-14 09:11:56

+1

@Tan,所以可能某些类型不被标记为'[Serializable]';对于测试建议,尝试手动序列化,通过使用XmlSerializer类 – 2009-12-14 09:16:36

+0

+1进行可串行化检查 – cjk 2009-12-14 09:24:05