【问题标题】:How to get Request Querystring values?如何获取请求查询字符串值?
【发布时间】:2013-09-29 19:08:57
【问题描述】:

我的 api 客户端代码在查询字符串中发送一个身份验证令牌,例如:

www.example.com/api/user/get/123?auth_token=ABC123

我正在使用 Mvc Web api 控制器,并且我有一个过滤器来检查 auth_token 是否有效,但我不确定如何访问请求查询字符串值。

这是我现在正在做的,但显然是错误的:

下面的 sn-p 在我的过滤器中,继承自:

ActionFilterAttribute

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
       base.OnActionExecuting(actionContext);

       if (actionContext.Request.Properties.ContainsKey("auth_token") &&
          actionContext.Request.Properties["auth_token"].ToString() == "ABC123")
       {
         ...
       }
}

【问题讨论】:

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


【解决方案1】:

使用 GetQueryNameValuePairs 扩展方法,如下所示:

var queryString = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value);

编辑 为避免重复键,请考虑使用ToLookup

var queryString = actionContext.Request.GetQueryNameValuePairs().ToLookup(x => x.Key, x => x.Value);

这是关于查找的博客文章:https://www.c-sharpcorner.com/UploadFile/vendettamit/using-lookup-for-duplicate-key-value-pairs-dictionary/

【讨论】:

  • 但请注意:ToDictionary 将在传递具有相同键的两个参数时抛出异常 - 例如 - defining an array
  • 你是对的。更好的是使用 ToLookup 投影名称/值对。
  • 我喜欢这个GetQueryNameValuePairs();这是另一种方法,使用LastOrDefault(...) stackoverflow.com/a/22432384/1175496
【解决方案2】:

在过滤器的OnActionExecuting方法中,您可以访问查询字符串并像这样解析它以获得令牌。

var queryString = actionContext.Request.RequestUri.Query;
if(!String.IsNullOrWhiteSpace(queryString))
{
    string token = HttpUtility.ParseQueryString(
                         queryString.Substring(1))["auth_token"];
}

但是,在查询字符串中传递标记是一种好习惯吗?可能不会,但这取决于你。 HTTP 标头可能是更好的选择,因为可以记录和缓存查询字符串。

【讨论】:

    【解决方案3】:

    另一种方法,类似于巴德里的:

    string qsValue = string.Empty;
    if (Request.QueryString.HasValue)
    {
       NameValueCollection queryStringNameValues = HttpUtility.ParseQueryString(Request.QueryString.Value);
       qsValue = queryStringNameValues.Get("auth_token");
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多