2012-05-20 14 views
5

Creé un ActionFilterAttribute para mi API web para autorizar a las personas. Obtención de accessToken por RequestUri está bien, sin embargo, quiero enviarlo en los datos del formulario. Mientras se lee Request.Content en el método onActionExecuting de ActionFilterAttribute, el servidor siempre tiene un resultado vacío. ¿Como puedó resolver esté problema? El código es como la siguiente:Lectura de datos de formulario en 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

¿Ha encontrado la respuesta? Estoy teniendo el mismo problema – Ahmadreza

Respuesta

3

Es es porque el HttpContent ha sido leído por el formateador antes ActionFilter. La API web solo permite leer contenido una vez. Entonces no puedes volver a leerlo.

Aquí hay una posible solución para usted. En primer lugar, hacer que su parámetro de acción como FormDataCollection:

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

Entonces, lo consigue en ActionFilter por código:

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); 
    } 
Cuestiones relacionadas