2012-05-20 10 views
5

में फॉर्म डेटा पढ़ना मैंने लोगों को अधिकृत करने के लिए अपने वेब एपीआई के लिए एक एक्शनफिल्टर एट्रिब्यूट बनाया। RequestUri द्वारा एक्सेस प्राप्त करना ठीक है, हालांकि मैं इसे फॉर्म डेटा में भेजना चाहता हूं। ActionFilterAttribute केActionExecuting विधि पर Request.Content को पढ़ने के दौरान, सर्वर का हमेशा खाली परिणाम होता है। इस समस्या का समाधान किस प्रकार से किया जा सकता है? कोड के रूप में नीचे की तरह है:एक्शनफिल्टर एट्रिब्यूट

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 से पहले संरूपक द्वारा पढ़ा गया है। वेब एपीआई केवल एक बार सामग्री पढ़ने की अनुमति देता है। तो आप इसे फिर से पढ़ने में असमर्थ हैं।

यहां आपके लिए एक संभावित समाधान है। सबसे पहले, अपने आप कार्रवाई पैरामीटर 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); 
    } 
संबंधित मुद्दे