2012-05-20 5 views
5

私は人を認証するために私のWeb API用のActionFilterAttributeを作成しました。 RequestUriでaccessTokenを取得するのは問題ありませんが、フォームデータで送信したいと思います。 ActionFilterAttributeのonActionExecutingメソッドでRequest.Contentを読み取っている間、サーバーは常に空の結果を返します。どうすればこの問題を解決できますか?コードは次のようになります。ActionFilterAttributeでフォームデータを読む

public class RequireAuthorization : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     actionContext.Request.Content.ReadAsStringAsync().ContinueWith((t) => 
     { 
      try 
      { 
       //query will result in empty string 
       string query = t.Result; 

       string UserID = HttpUtility.ParseQueryString(query).Get("UserID"); 
       string accessToken = HttpUtility.ParseQueryString(query).Get("AccessToken"); 

       UserRepository repository = new UserRepository(); 
       repository.IsTokenValid(Convert.ToInt32(UserID), accessToken); 
      } 
      catch (Exception ex) 
      { 
       var response = new HttpResponseMessage 
       { 
        Content = 
         new StringContent("This token is not valid, please refresh token or obtain valid token!"), 
        StatusCode = HttpStatusCode.Unauthorized 
       }; 

       throw new HttpResponseException(response); 
      } 
     }); 


     base.OnActionExecuting(actionContext); 
    } 
} 
+0

をあなたは答えを見つけますか?私は同じ問題を抱えている – Ahmadreza

答えて

3

これは、HttpContentがActionFilterの前にフォーマッタによって読み取られたためです。 Web APIでは、コンテンツを1回だけ読み取ることができます。あなたはそれを再び読むことができません。

あなたには可能な解決策があります。まず、FormDataCollectionとしてあなたのアクションパラメータを作成:

[RequireAuthorization] 
    public HttpResponseMessage PostTodo(FormDataCollection formData) 
    { 
     Todo todo = formData.ReadAs<Todo>(); 
     // ... 

を次に、コードでのActionFilterにそれを得る:

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     var formData = actionContext.ActionArguments["formData"] as FormDataCollection; 
     if (formData != null) 
     { 
      var userID = formData.Get("UserID"); 
      var accessToken = formData.Get("AccessToken"); 
      // authorize 
     } 

     base.OnActionExecuting(actionContext); 
    } 
関連する問題