2012-04-09 6 views
0

Ich habe die folgende Aktion in meinem ASP.NET Web API:ASP.NET Web API gibt nur ein Objekt in der Sammlung

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; 
     } 
    } 

Allerdings, wenn ich es von Android-Anwendung abfragen Autos von bestimmten Benutzern zu erhalten (durch JSON) .. sagen wir mit ID 2, es gibt Sammlung von 9 Autos (das ist richtig, Benutzer 2 hat 9 Autos), aber nur das erste Auto hat richtige Feldwerte (Name, Preis etc.), der Rest der Autos haben null in allen Bereichen.

Das ist wirklich seltsam, verursachen das Problem passiert, wenn ich diese Zeilen Code hinzugefügt:

// 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; 
      } 

Nach dem Entfernen alles funktioniert perfekt Bußgelder und alle Fahrzeuge sind geeignete Werte in Feldern (nicht mehr nullt) ..

Haben Sie eine Idee, wie Sie dieses sehr seltsame Verhalten erklären können?

Ich denke nicht, dass es wichtig ist (verursachen alle anderen Aktionen, wo ich diese Art der Autorisierung nicht funktioniert ohne Probleme), aber ich möchte erwähnen, dass ich von Android-App benutze ich gson zu deserialize und auf der Serverseite Ich verwende JSON.NET zum Serialisieren.

+0

in Ihrem zweiten Codebeispiel werden Sie die Ausnahme auslösen, wenn der Benutzername mit dem des gefundenen Benutzers übereinstimmt – Bond

+0

Ja, das ist nur ein Tippfehler. (Der Code im Schnipsel darüber war korrekt). Korrigiert das zweite Snippet auch. – Bart

+0

Haben Sie versucht, die Autos zuerst zu ziehen und danach die Berechtigungsprüfung durchzuführen? Das ist wirklich komisches Verhalten. Sind Ihre CarEntities das einzige Kontextobjekt? Verwenden Sie EDM und haben Sie bestimmte Assoziationskonfigurationen? – Bond

Antwort

0

schaute ich auf die Datenbank-Zugriffscode und ich habe Autorisierungscode in using-Anweisung:

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); 
     } 
    } 

Es half und es funktioniert jetzt. Allerdings bin ich nicht wirklich sicher, warum die Ausführung dieses Codes in separaten Kontext geholfen .. irgendwelche Ideen?