C# Web 服务返回时丢失数据

问题描述 投票:0回答:3

我正在编写一个调用 webmethod 的客户端程序,但是当我获取返回数据时,某些字段和对象上缺少值。

webmethod 依次调用 WCF 方法,并且在 WCF 方法中返回数据很好。但是当它传递给网络服务时,返回数据丢失了。

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


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

    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().");
        }
    }

获取重定位分配:

    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().");
        }
    }

在所有这些代码中,返回数据都很好。仅当传递到 webmethod 时才会丢失数据。

c# wcf web-services asmx
3个回答
1
投票

此外,消息中 XML 标签的顺序也有所不同 - 大约两年前我遇到过类似的问题,在这种情况下,参数值在传输过程中“消失”,因为发送部分对标签的排序与定义的不同在架构中。


1
投票


1
投票

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

不被

XmlSerializer
使用。
    

© www.soinside.com 2019 - 2024. All rights reserved.