2009-12-14 78 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