Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP Net/ASP Net核心中,是否有方法处理URL路径段中的参数_C#_Asp.net_Asp.net Core_Url_Url Parameters - Fatal编程技术网

C# 在ASP Net/ASP Net核心中,是否有方法处理URL路径段中的参数

C# 在ASP Net/ASP Net核心中,是否有方法处理URL路径段中的参数,c#,asp.net,asp.net-core,url,url-parameters,C#,Asp.net,Asp.net Core,Url,Url Parameters,最近,我读了一篇关于URL及其部分以及标准中定义的内容的文章。 关于参数有一个有趣的部分。通常,可以通过以下方式之一传递参数: 在URL路径中作为一个段 在URL查询字符串中 在请求机构中 在请求头中 但是,根据文章,还有一种方法——在URL路径段中传递参数,并用分号将其与段分开: 参数–谈到参数,这些参数也可以出现在路径之后,但在查询字符串之前,也可以与URL的其余部分分开,并通过;字符,例如: http://www.blah.com/some/crazy/path.html;param1

最近,我读了一篇关于URL及其部分以及标准中定义的内容的文章。 关于参数有一个有趣的部分。通常,可以通过以下方式之一传递参数:

  • 在URL路径中作为一个段
  • 在URL查询字符串中
  • 在请求机构中
  • 在请求头中
但是,根据文章,还有一种方法——在URL路径段中传递参数,并用分号将其与段分开:

参数–谈到参数,这些参数也可以出现在路径之后,但在查询字符串之前,也可以与URL的其余部分分开,并通过;字符,例如:

http://www.blah.com/some/crazy/path.html;param1=foo;参数2=巴

我以前从未遇到过这种方法,文章提到很少使用这种方法。
是在.NET中受支持的,特别是在ASP.NET或ASP.NET核心中?

我真的不在乎这种奇怪的查询参数格式是否标准。如果您亲自尝试,您将看到ASP.NET Core不支持该格式。它仍然被认为是一个段,一旦被解析,如果它没有任何路由模式匹配,响应就是
404

为了支持这种奇怪的格式(我在你的问题中谈论的是原始格式,而不是你评论中的另一种更奇怪的格式),理论上可以使用自定义的
QueryStringValueProviderFactory
。默认设置是从
Request.Query
创建
QueryStringValueProvider
。在自定义设置中,您可以从自己的参数集创建一个
QueryStringValueProvider
,该参数集可以从原始请求URL解析。但是,这种方法并不容易,因为在模型绑定阶段(在该阶段,值提供者用于构建请求模型和操作参数)请求已经太迟了。因为太晚了,所以您的请求路径甚至与任何路由模式都不匹配,因此管道将短路,响应为404

从技术上讲,为了遵循这种方法,您需要以某种方式使其首先到达模型绑定阶段(这意味着使请求工作起来,就好像分号分隔的查询参数不存在一样)。我认为可以删除路由进程中的最后一段(如果它包含分号)。然而,这当然不容易。这种方式太复杂了

在这里,我想介绍另一种更简单(有效)的方法。我们可以使用中间件来解析URL,并在请求进入MVC管道之前自己构建查询字符串(可能附加到现有的标准查询字符串,如果有的话)

就这么简单:

//an extension method for conveniently registering your middleware later 
public static class ComplexQueryStringMiddlewareExtensions
{
    public static IApplicationBuilder UseComplexQueryStringMiddleware(this IApplicationBuilder appBuilder)
    {
        return appBuilder.Use((context, next) => {
            var path = context.Request.Path;
            var semicolonSepParameters = path.Value.Split(';');
            //the first part is always the correct path
            context.Request.Path = semicolonSepParameters[0];
            semicolonSepParameters = semicolonSepParameters.Skip(1).Where(e => !string.IsNullOrWhiteSpace(e)).ToArray();
            if (semicolonSepParameters.Length > 0)
            {
                var appendedQueryString = string.Join("&", semicolonSepParameters);
                //in case there is some standard query string as well
                if (context.Request.Query != null && context.Request.Query.Count > 0)
                {
                    appendedQueryString = context.Request.QueryString + "&" + appendedQueryString;
                } else
                {
                    appendedQueryString = "?" + appendedQueryString;
                }
                context.Request.QueryString = new Microsoft.AspNetCore.Http.QueryString(appendedQueryString);
            }
            return next();
        });
    }
}
现在在
启动.Configure
方法中,确保您的中间件注册放在
用户外出之前(如果有):


现在您的
http://www.blah.com/some/crazy/path.html;param1=foo;param2=bar
应该像
http://www.blah.com/some/crazy/path.html?param1=foo¶m2=bar
。您甚至可以将这两种格式混合在一起,如
http://www.blah.com/some/crazy/path.html;param1=foo;param2=bar?param3=ok¶m4=yes

您检查过这个吗:是的,我检查过。我没有为此URL段参数找到任何预定义属性,如[FromBody]或[FromRoute]。我想应该有一种方法来编写一些实现这种东西的自定义机制,但我不知道一种合适的方法来编写它。@SENya你的问题让我头疼,但根据第12页,它是一个类似于“&”的子文件,所以从技术上讲,你可以使用相同的方法。然而,我测试了它。asp.net内核不会解析它。在“?”之后的第一个参数中,你会得到一个长字符串“dddd;test2=dddddd”。根据文章,你也可以在不同的URL段中路径这些参数。它说:“每个路径段都可以包含参数,这些参数由一个;(分号)字符与段分开,例如:上面的URL是完全有效的,尽管几乎从未使用过路径段保存参数的能力(我个人从未见过)。”asp net如何处理这一点很有趣。它会从第一段开始用分号修剪url的结尾,并将其余部分作为参数传递吗?非常感谢。我绝对不会在实际项目中使用这个不寻常的参数,也不会推荐它。我从未见过有人使用它,而且afaik modern web framework不支持它。但我发现它是一个标准的一部分,并且在现有的问题、博客或文章中没有涉及到。如果有可能在ASP.NETCore中支持它,我开始感兴趣。所以我认为这可能是一个有用的问题。也许这也将有助于处理使用这种罕见案例的遗留问题的人。
app.UseComplexQueryStringMiddleware();
//if this exists (which is usually by the default generated code)
//this must be after the above
app.UseRouting();
//of course the UseEndpoints is always at the end