2017-10-31 11 views
2

を解析奇妙な行動コントローラにこの方法を考えるルート

[HttpGet("{id}")] 
public string Get(int id) 
{ 
    return "value"; 
} 

このような要求が成功します! http://localhost:53351/api/values/abc

なぜですか?

IMHO、これはBad RequestのIDが数字ではないため(abcです)送信されます。代わりに、idパラメータとして0(ゼロ)を取得しています。

また=>

非常によく似た問題は、このような方法で起こる:この http://localhost:53351/api/values/1?String=hello&Number=ABCとして解析し、置かれ オブジェクト等の要求に

[HttpGet("{id}")] 
public string Get(int id, [FromQuery]QueryObject queryObj) 
{ 
    return "value"; 
} 

public class QueryObject 
{ 
    public int Number { get; set; } 
    public string String { get; set; } 
} 

queryObjのnumberプロパティは0(ゼロ)に設定されています。

これにより、無効なデータがパイプを通過します。私たちはこの行動を避けることができますか?

答えて

2

あなたは、このようなパラメータの種類を制限することができます:あなたはモデルプロパティに[FromQuery]属性を追加する必要がdocs

秒からパート

[HttpGet("{id:int}")] 

public class QueryObject 
{ 
    [FromQuery(Name = "Number")] 
    public int Number { get; set; } 
    [FromQuery(Name = "String")] 
    public string String { get; set; } 
} 
+0

うわー、素敵! 「クエリーオブジェクト」でどのように取得するのですか?私は問題を反映するためにOPを編集しました(MOREOVERタイトルの下)。 – SuperJMN

+1

@SuperJMN、私は答えを –

+0

更新しましたありがとう!しかし、どのようにQueryObjectsに制限を加えることができますか? Numberが整数だけを受け入れるようにします。あなたが置く属性には名前だけがあります(マッピング目的のために、私は推測します)。私が必要とするのは、 "&Number = abc"をクエリーストリングに入れれば、Numberに0を持たないようにすることです。私は、クエリがうまくフォーマットされていないことを消費者に示すBad Requestまたは何かを取得したいと思います。 – SuperJMN