2012-05-20 8 views
5

Utworzono ActionFilterAttribute dla mojego interfejsu webowego w celu autoryzacji osób. Uzyskiwanie AccessToken przez RequestUri jest w porządku, jednak chcę wysłać go w postaci danych formularza. Podczas odczytu Request.Content w metodzie onActionExecuting ActionFilterAttribute, serwer zawsze ma pusty wynik. Jak mogę rozwiązać ten problem? Kod jest taki, jak poniżej:Czytanie danych formularzy w 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

Znalazłeś odpowiedź? Mam ten sam problem – Ahmadreza

Odpowiedz

3

Jest tak, ponieważ HttpContent został odczytany przez formatter przed ActionFilter. Web API pozwala tylko raz czytać treść. Więc nie możesz go przeczytać ponownie.

Oto możliwe rozwiązanie dla Ciebie. Po pierwsze, dokonać parametru działania jako FormDataCollection:

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

Następnie dostać w ActionFilter kodem:

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); 
    } 
Powiązane problemy