2016-06-13 12 views
0

C#およびASP.NET Web APIを使用してAPIを作成していますが、パラメータが認識されない場合にエラーを返すようにします。例えばASP Web APIで無効なパラメータが指定された場合にエラーを返します

:エラーを返す必要があり

/api/Events 

イベント

/api/Events?startTime={{startTime}} 

のリストは、特定の時間に

/api/Events?someRandomInvalidParameter={{something}} 

を開始したイベントのリストを返す必要がありますする必要があり

これを行うには良い設定方法がありますか?そうでない場合は、どのように自分自身をチェックするためのパラメータのリストを得ることができます。

答えて

1

の順序によってチェック/管理する必要があります。

public class InvalidQueryStringRejectorAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var arguments = actionContext.ActionArguments.Keys; 

     var queryString = actionContext.Request.GetQueryNameValuePairs() 
      .Select(q => q.Key); 

     var invalidParams = queryString.Where(k => !arguments.Contains(k)); 

     if (invalidParams.Any()) 
     { 
      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new 
      { 
       message = "Invalid query string parameters", 
       parameters = invalidParams 
      }); 
     } 
    } 
} 

フィルタは、メソッドのシグネチャと一致しないクエリ文字列パラメータを持つすべての要求を拒否すること。

[InvalidQueryStringRejector] 
public IHttpActionResult Get(string value) 
{ 
    return Ok(value); 
} 

またはあなたのHttpConfigurationオブジェクト内に登録することにより、任意のアクションに適用されます:

config.Filters.Add(new InvalidQueryStringRejectorAttribute()); 
+0

これは完全に動作します! – Mat

1

だから、通常の呼び出しが返されます、私は生きているか、私は生きている空

http://localhost:1578/api/alive?id=1 //OR 
    http://localhost:1578/api/alive 

しかし、あなたはこの

ようにそれを呼び出すようにしようとした場合、この

public string Get() 
     { 
      return "I'm alive empty"; 
     } 

    public string Get([FromUri] int id) 
     { 
      return "I'm alive"; 
     } 

のような強く型付けされたアクションを試してみてください

http://localhost:1578/api/alive?blablabla=1 

このエラーが発生する可能性があります。 要求されたリソースは、httpメソッド 'GET'をサポートしていません。

+0

おかげで、アントン

あなたはこのようにそれを使用することができます。 1つのパラメータが有効で、1つのパラメータが有効でない場合でも、これは機能しますか?例えば私の限られたテストから、少なくとも1つの有効なパラメータがあれば、Getメソッドの1つにバインドされます - いくつかのオプションのパラメータを使用している可能性がありますか?'string startTime =" "' – Mat

+0

はい、これは動作します。これは、Actionがidパラメータを検索しようとし、他のすべてを無視するためです。 http:// localhost:1578/api/alive?qwe = 2&id = 1でも動作します。 –

+0

どうすれば動作しないのですか? qwe = 2を追加しても何もしない場合、ユーザーに通知する必要があります。 – Mat

0

私はあなたが
例オーバーライドメソッドされるべきだと思う:

[Route("/app/Events/{startTime})"] 
public ApiResponse Get(string startTime) 
{ 
} 


[Route("/app/Events/{startTime}/{someRandomeInvalid}")] 
public ApiResponse Get(string startTime, string someRandomeInvalid) 
{ 
} 


明示的にパラメータ名を設定しないでください。あなたはこれを自動化するActionFilterを作成することができ、パラメータ

+0

こんにちはPhong、私は明示的にそのようなURLを設定したくないので、私はパラメータを使用したいと思います。複数のオプションパラメータが必要な場合はどうすればよいですか?注文はどうですか? また、人々が使用する可能性のある無効なパラメータを事前に知ることはできません。 – Mat

+0

このパラメータは、URL.http:// localhost:8080/app/Events/19901101のhttp:// localhost:8080/app/Events/19901101/somethingに入力された値の位置と一致します。 –

関連する問題