【问题标题】:How to read keyless querystring in .net core如何在 .net 核心中读取无密钥查询字符串
【发布时间】:2018-07-11 15:01:27
【问题描述】:

.NET Core 中无密钥查询字符串参数的替代方法是什么?

在 asp.net 中,语法为 Request.QueryString[ null ],但 .NET Core 会为此引发 null 异常,不允许您传入 null 作为键名。

比如我需要支持这种格式的url:

http://localhost:54301/RBLeCORS.ashx?{Command:CalcEngineStatus}

但是,除此之外,我还需要能够处理通过 $.ajax() 调用发布的命令,该命令来自发布数据而不是放在查询字符串上的 javascript 调用。

无钥匙(我看到 cmets 想称它为无价值,我猜这适用于 .NET Core,但我看到它们被称为无钥匙 for asp.net b/c 您使用null 密钥访问)值是一个 json 对象,它可以包含的不仅仅是我给出的这个简单示例。

更新:这是我当前的代码作为解决方法。

        string queryData = null;
        if (context.Request.Query.Count == 1 )
        {
            var firstKey = context.Request.Query.Keys.ElementAt(0);
            var firstValue = context.Request.Query[firstKey];

            if ( string.IsNullOrEmpty( firstValue ) )
            {
                queryData = firstKey;
            }
        }

【问题讨论】:

  • 无钥匙是什么意思?
  • 你能展示一个你试图解析的 uri 的例子吗?
  • 如果您只是期待 JSON 命令或其他可解析的命令,为什么不将其转换为字符串以便解析 (var command = Request.HasValue ? Request.QueryString.Value.Substring(1) : "{}";)
  • @JasonW 我需要支持在 QueryString 上传递的信息以及在表单中发布的数据。将测试您的 Request.HasValue 方法,但它看起来比我在上面发布的解决方法更干净。

标签: c# .net-core query-string


【解决方案1】:

来自here 我注意到了这一点:

您可以使用 null 作为 NameValueCollection 的键,它会 给你一个逗号分隔的参数名称列表 价值观。

对于http://example.com?bar=3&foo,您将使用 Request.QueryString[null] 它会检索 foo。

所以,在 dotnet core 中,这行不通。

Request 包含一个名为 Query 的属性,其类型为 IQueryCollection
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.iquerycollection?view=aspnetcore-2.1

有了这个,您可以使用Item[String] 通过已知键获取项目,如您所知。

Keys 包含查询集合中存在的所有键的列表。

我认为你想要的是获取所有值,而不考虑它们的键?

你可以使用:

var values = Request.Query.ToList ()
    .SelectMany (x => x.Value);

values 将是传入查询字符串的值列表:

?key1=val1&key2=val2

会回来

  • val1
  • val2

【讨论】:

  • 我现在正在做与此类似的事情,寻找一个键并确定它是什么,然后如果关联的值为空,我假设它是“我在 asp 中处理的同一件事”。净并继续。将查看是否有人发布任何内容,否则我将显示我的示例代码。
  • 无论如何都显示出来,我们可能有更好的机会回答这个问题!
【解决方案2】:

如果您只是想将这样的查询字符串用作“无键”:

{pathToRoute}?item1&item2

那么你可以使用ContainsKey来检查是否传递了一个参数:

Request.Query.ContainsKey("item1") // true

如果您想从查询字符串中获取所有这些命令的列表:

string[] commands = Request.Query
    .Where(m => string.IsNullOrEmpty(m.Value))
    .Select(m => m.Key).ToArray();

对于?{Command:CalcEngineStatus}&{Command:Command2},这将返回{Command:CalcEngineStatus}{Command:Command2} 的字符串[]。

【讨论】:

  • 我会认为那些“无价值”,而不是“无钥匙”。
  • 我同意 valueless 更合适:)
  • 我明白你对 valueless vs keyless 的看法,而且,我可以检查一个特定的键,因为它只是一个传递给 Web 服务的 json 字符串/包。
  • 添加了附加代码以根据您添加到 OP 的示例加载这些命令的列表...希望这可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多