如何在web api,C#中的Action过滤器中获取post表单参数值?

时间:2017-02-14 21:41:19

标签: c# asp.net asp.net-web-api

如何使用web api中的Request读取post表单参数值?我有一个控制器

    [Route("")]
    [HttpPost]
    [AuthenticationAttribute]
    public void PostQuery()
    {
          //some code
    }

我已单独定义AuthenticationAttribute类

 public class AuthenticationAttribute : Attribute, IAuthenticationFilter
{


    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
    // I want to read the post paramter values over here
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        return Task.Run(
            () =>
                {

                });
    }

    public AuthenticationAttribute()
    {

    }
}

我想检查AuthenticateAsync函数中的post参数。

我试过

context.Request.Content.ReadAsStringAsync().Result;

但此字符串为空。我能够使用

读取查询参数
context.Request.GetQueryNameValuePairs();

但无法找到获取帖子表单参数的方法。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:5)

var reader = new StreamReader(HttpContext.Current.Request.InputStream);
var content = reader.ReadToEnd();
var jObj = (JObject)JsonConvert.DeserializeObject(content);

foreach (JToken token in jObj.Children())
{
    if (token is JProperty)
    {
        var prop = token as JProperty;

        if (prop.Name.Equals("skipExternal") && prop.Value.ToString().Equals("True"))
        {
            // Logic...
        }
    }
}

这是我使用的代码。我想检查天气参数skipExternal是作为post参数中的True发送的。

答案 1 :(得分:0)

我不熟悉context.Request.GetQueryNameValuePairs(),但从名称来看,它听起来像会从查询字符串中提取参数。由于您正在执行POST,因此查询字符串中没有参数(它们位于POST正文中)。

试试这个:

context.HttpContext.Request.Params["groupId"]

或者这个:

context.Controller.ValueProvider.GetValue("groupId").AttemptedValue

使用这些将取决于您如何实施模型和提供商。

答案 2 :(得分:0)

使用

context.ActionContext.ActionArguments

这会得到一个Dictionary<string, object>,其中键是参数的名称,值是参数本身。

这假设action方法正在使用模型绑定将传入的POST值绑定到模型。