2012-04-09 65 views
0

只有一個對象我在我的ASP.NET Web API了以下行動:的ASP.NET Web API返回的集合

public IEnumerable<Car> carssOfUser(int id, String username, String password) 
    { 

     using (var context = new CarEntities()) 
     { 
      // Authorization. Allow user only to get his own cars 
      User userQueried = context.Users.Where(u => u.id == id).FirstOrDefault(); 
      if (!userQueried.username.Equals(username)) 
      { 
       throw new HttpResponseException(HttpStatusCode.Unauthorized); 
       //return null; 
      } 

      IEnumerable<Car> cars = context.Cars.Where(p => p.ownerId == id).ToList(); 
      return cars; 
     } 
    } 

但是,如果我查詢它從Android應用程序獲得給定用戶的汽車(通過JSON)..讓我們說,與ID 2,它返回9車(這是正確的,用戶2有9輛車)的集合,但只有第一輛車有適當的字段值(名稱,價格等),其餘的汽車有空在所有領域。

這真的很奇怪,會導致發生的問題,當我加入這行代碼:

// Authorization. Allow user only to get his own cars 
      User userQueried = context.Users.Where(u => u.id == id).FirstOrDefault(); 
      if (!userQueried.username.Equals(username)) 
      { 
       throw new HttpResponseException(HttpStatusCode.Unauthorized); 
       //return null; 
      } 

取出後,一切都運行完美的罰款和所有車領域具有正確的值(不是空值了)..

你有什麼想法如何解釋這個非常奇怪的行爲?

我不認爲這很重要(導致所有其他行動,我沒有這種授權工作沒有問題),但我想提到,從Android應用程序我使用gson反序列化,並在服務器端我使用JSON.NET來序列化。

+0

在您的第二個代碼示例中,如果用戶名與找到的用戶名匹配,您將拋出異常 – Bond 2012-04-09 12:20:34

+0

是的,這只是一個錯字。 (上面代碼片段中的代碼是正確的)。更正了第二個片段。 – Bart 2012-04-09 12:23:46

+0

您是否曾嘗試先拉車,然後進行授權檢查?這真是奇怪的行爲。你的CarEntities是唯一的上下文對象嗎?你使用EDM並有一些特定的關聯配置? – Bond 2012-04-09 12:32:44

回答

0

我看了一下數據庫訪問代碼,我把授權碼到using語句:

using (var context = new GeoDiaryEntities()) 
    { 
     // Authorization. Allow user only to get his own travels 
     User userQueried = context.Users.Where(u => u.id == id).FirstOrDefault(); 
     if (!userQueried.username.Equals(username)) 
     { 
      throw new HttpResponseException(HttpStatusCode.Unauthorized); 
     } 
    } 

它幫助和現在的工作。 但是,我不確定爲什麼在不同的環境下執行此代碼有助於.. 有什麼想法?