0

ASP.NETWebAPIで次のアクションがあります。

    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台の車があります)が、適切なのは最初の車だけです。フィールド値(名前、価格など)の場合、残りの車はすべてのフィールドでnullになります。

これは本当に奇妙なことです。次のコード行を追加したときに問題が発生した原因です。

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

それを削除した後、すべてが完全に正常に機能し、すべての車がフィールドに適切な値を持ちます(もはやnullではありません)...

このimoの非常に奇妙な振る舞いを説明する方法を知っていますか?

私はそれが重要だとは思いませんが(この種の承認がない他のすべてのアクションは問題なく機能するため)、Androidアプリからはgsonを使用して逆シリアル化し、サーバー側ではJSONを使用します。シリアル化するNET。

4

1 に答える 1

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

それは助けになり、今は機能しています。ただし、このコードを別のコンテキストで実行することがなぜ役立つのか、よくわかりません。何かアイデアはありますか?

于 2012-04-09T12:30:54.047 に答える