【问题标题】:C# webservice losing data on returnC# webservice 在返回时丢失数据
【发布时间】:2009-12-14 08:30:59
【问题描述】:

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

webmethod 反过来调用WCF 方法,在 WCF 方法中返回数据很好。但是当它传递给 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 时才会丢失数据。

在此处输入代码。

【问题讨论】:

    标签: c# wcf web-services asmx


    【解决方案1】:

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

    【讨论】:

    • ...并且在服务器端使用 WCF 来定义 Web 服务。
    • 是 wcf 用于定义 web 服务。你是怎么解决这个问题的?
    • 在我们的例子中,通过让调用者/客户端更改其实现以遵循 WCF 服务架构中定义的消息元素(XML 标记)的顺序来解决该错误。
    【解决方案2】:

    确保访问 XML 标记时两端的大小写相同。如果大小写不同,则不会读取该值。

    【讨论】:

    • 你是指webreference下的XML文件吗?
    • 不,您的服务返回的 xml。它返回一个包含 XML 的字符串?
    • 不是两端的铸件相同。
    • 您正在构建什么客户端类型(asp.net、winforms?)您能否发布用于调用 Web 服务的代码作为对您问题的编辑?
    • 感谢更新,可以发一下这个方法吗:service.GetRelocationAssignment(query, out doc);
    【解决方案3】:

    您应该检查所有消息是否从您的网络服务发回。手动调用您的网络服务并检查其响应。

    • 如果所有数据都在那里,可能您的 Web 服务引用已过时;通过右键单击您的网络服务参考并选择“更新”来更新它
    • 如果您的数据没有返回,您的问题可能与 Web 服务代码有关。 你应该再次检查你的序列化代码(如果有的话),并确保所有返回的类型都是[Serializable]。您应该检查所有返回类型是否为 public,因为它是序列化的强制要求。

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

    【讨论】:

    • 我的webmethod只有这样 [WebMethod] public ReLocationResult GetItemInfo(ReLocationDoc query, out ReLocationDoc reLocationDoc) { return m_reLocationClient.GetItemInfo(query, out reLocationDoc);在 wcf 中进行 iam 调试时,所有返回数据都很好。当它返回到 web 方法时。数据丢失。
    • @Tan,所以可能某些类型没有标记为[Serializable];对于测试建议,请尝试使用 XmlSerializer 类手动对其进行序列化
    • [Seria;izable] 未使用 bt XML Seria;ization。
    • @John,真丢脸;你能再检查一下我的信息吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多