2017-01-12 8 views
1

Web Api Controllerを足場で生成しました.WebApiConfigとWeb Apiを追加しましたが、不正なデータが返されました。ASP.NET Web APIが不正なデータを返す

例: 私はいくつかのエンティティを持っています - ID名、姓などの属性を持つプレイヤー、属性名とIDを持つPositionId、Position。私は通常のPositionController経由で1つの位置にアクセスしたい場合、非常にうまく動作しますが、Web APIを使って1つの位置にアクセスしようとすると、この1つの位置に接続されているすべてのオブジェクトが返されます。

など。私はそれが

{"PositionId":1,"name":"Defensive midfield"} 

を返すべきURL api/PositionsAPI/1 で1位を取得したいが、それはあなたがそれがこの位置に接続されたすべての選手を返すことがわかります

{"Players":[{"Team":{"Players":[{"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1},{"Team":{"Players":[{"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"PositionId":1,"name":"Defensive midfield"} 

返します。私はなぜそれが起こっているのか分かりません。

これは、あなたが必要とするだけのプロパティを持つ匿名オブジェクトを返すことができapi/PositionsAPI/1

[ResponseType(typeof(Position))] 
public IHttpActionResult GetPosition(int id) 
{ 
    Position position = db.Positions.Find(id); 
    if (position == null) 
    { 
     return NotFound(); 
    } 

    return Ok(position); 
} 

答えて

1

に責任がある私のWeb APIコントローラからの方法です。たとえば、

var position = db.Positions // Make sure type is var 
    .Where(x => x.PositionId == id) 
    .Select(x => new 
    { 
     PositionId = x.PositionId, 
     name = x.name 
    }) 
    .FirstOrDefault(); 

シリアライズ参照を無効にするか、無効にします。

db.Configuration.ProxyCreationEnabled = false; 
+0

これは機能します。ありがとうございました! – azxcqqq

0

エンティティをモデル化した方法が分かりませんが、ルーティングが正しく設定されているかどうかを確認するのは少し難しいです。たとえば、あなたが言及した:

API/PositionsAPI/1

を私はPositionsAPIを仮定していることはあなたのコントローラであり、あなたの位置のオブジェクトは、次のようになります

public class Position 
{ 
    public int PositionId {get; set;} 
    public string name {get; set;} 
} 

だからあなたがする必要がありますあなたが期待しているJSONを見て...

正しいコントローラで正しいメソッドを実行していることを確認してください。メソッド内の最初の行にブレークポイントを追加し、Visual Studioからブレークポイントを実行し、RESTクライアント(Postmanなど)を介してデータを取得してみてください。同じエンドポイントを呼び出すことによってブレークポイントに当たっていない場合は、ルーティングの問題が発生している可能性が非常に高いです。

[RoutePrefix("PositionsAPI")] 
public class PositionsAPIController : ApiController 

そして、あなたは、いくつかの他の方法を打つていないことを保証するためにあなたの方法でこれを行う:それは、このような各コントローラのRoutesを指定固定するために

//GET: api/PositionsAPI/1 (this is just to make it easier for future reference) 
[ResponseType(typeof(Position))] 
[HttpGet] 
[Route("{id}")] 
public IHttpActionResult GetPosition(int id) 
    { 
     Position position = db.Positions.Find(id); 
     if (position == null) 
     { 
      return NotFound(); 
     } 

     return Ok(position); 
    } 

願って助けて!

関連する問題