如何在 .net core 中读取无键查询字符串

5
在.NET Core中,不存在无键查询字符串参数的替代方式吗?
在asp.net中,语法为Request.QueryString[ null ],然而,.NET Core会抛出null异常,不允许您传递null作为键名。
例如,我需要支持以下格式的url: http://localhost:54301/RBLeCORS.ashx?{Command:CalcEngineStatus} 但是除此之外,我还需要能够处理通过javascript的$.ajax()调用发布的命令,其中数据是发布而非放在查询字符串中。
该值无键(评论中说应称其为无值,这对于.NET Core来说是合适的,但我看到它们被称为无键用于asp.net,因为您可以使用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;
            }
        }

6
"keyless"的意思是无钥匙的。 - Ehsan Sajjad
2
你能展示一下你正在尝试解析的URI的例子吗? - gunr2171
如果你只是期望一个可解析的JSON命令或其他解析对象,为什么不将其转换为字符串以便于解析(var command = Request.HasValue ? Request.QueryString.Value.Substring(1) : "{}";)? - Jason W
@JasonW 我需要支持从 QueryString 传递的信息和表单中发布的数据。我会测试你的 Request.HasValue 方法,但它看起来比我上面发布的解决方法更简洁。 - Terry
3个回答

2

我从这里注意到了以下内容:

你可以使用null作为NameValueCollection的键,它将给你一个逗号分隔的参数名称列表,这些参数没有值。

例如对于http://example.com?bar=3&foo,你可以使用Request.QueryString[null]来检索foo。

然而,在dotnet core中,这种方法不起作用。

Request包含一个名为Query的属性,该属性的类型为IQueryCollection
https://learn.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.net中继续进行。如果有人发布任何内容,我会看看,否则我将展示我的示例代码。 - Terry
无论如何,展示出来吧,这样我们可能更有机会回答这个问题! - Alex

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} 的字符串数组。

我认为它们是“无价值的”,而不是“无关键的”。 - mason
我同意“valueless”更加恰当 :) - Jason W
我理解你对于无值 vs 无键的观点,但是我也可以检查一个特定的键,因为它只是作为一个 JSON 字符串/包传递给 web 服务。 - Terry
添加了额外的代码来加载基于您添加到OP的示例的命令列表...希望这可能会有所帮助。 - Jason W

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接