简体   繁体   English

在ActionFilterAttribute中读取表单数据

[英]Reading Form Data in ActionFilterAttribute

I created an ActionFilterAttribute for my web api in order to authorize people. 我为我的Web api创建了一个ActionFilterAttribute来授权人员。 Getting accessToken by RequestUri is okay, however i want to send it in form data. 通过RequestUri获取accessToken是可以的,但是我想以表单数据发送它。 While reading Request.Content in onActionExecuting method of ActionFilterAttribute, server always has an empty result. 在使用ActionFilterAttribute的onActionExecuting方法读取Request.Content时,服务器始终有一个空结果。 How can i solve this problem? 我怎么解决这个问题? The code is as like as below: 代码如下所示:

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

It's is because the HttpContent has been read by the formatter before ActionFilter. 这是因为格式化程序在ActionFilter之前已读取HttpContent。 Web API only allows reading content once. Web API只允许读取一次内容。 So you are unable to read it again. 因此,您将无法再次阅读。

Here is a possible solution to you. 这是您可能的解决方案。 First, make your action parameter as FormDataCollection: 首先,将操作参数设置为FormDataCollection:

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

Then, get it in ActionFilter by code: 然后,通过代码在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);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM