2012-05-20 53 views
5

Tôi đã tạo một ActionFilterAttribute cho api web của mình để ủy quyền cho mọi người. Nhận accessToken bởi RequestUri là okay, tuy nhiên tôi muốn gửi nó trong dữ liệu biểu mẫu. Trong khi đọc Request.Content trong phương thức onActionExecuting của ActionFilterAttribute, máy chủ luôn có kết quả rỗng. Làm thế nào tôi có thể giải quyết vấn đề này? Mã này giống như sau:Đọc biểu mẫu dữ liệu trong 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

Bạn đã tìm thấy câu trả lời? Tôi đang gặp vấn đề – Ahmadreza

Trả lời

3

Đó là vì HttpContent đã được đọc bởi trình định dạng trước ActionFilter. Web API chỉ cho phép đọc nội dung một lần. Vì vậy, bạn không thể đọc lại.

Đây là giải pháp khả thi cho bạn. Trước tiên, hãy tham số hành động của bạn như FormDataCollection:

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

Sau đó, nhận được nó trong ActionFilter theo mã:

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); 
    } 
Các vấn đề liên quan