Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 从正则表达式读取捕获组,这些捕获组也是URL重写规则?可能的_C#_Asp.net_Regex_Iis 7_Url Rewriting - Fatal编程技术网

C# 从正则表达式读取捕获组,这些捕获组也是URL重写规则?可能的

C# 从正则表达式读取捕获组,这些捕获组也是URL重写规则?可能的,c#,asp.net,regex,iis-7,url-rewriting,C#,Asp.net,Regex,Iis 7,Url Rewriting,给定如下URL重写规则: <rule name="RewriteUserFriendlyThings" stopProcessing="true"> <match url="^cat/sub-cat/(\d+)/([^/]+)/?$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /&g

给定如下URL重写规则:

 <rule name="RewriteUserFriendlyThings" stopProcessing="true">
        <match url="^cat/sub-cat/(\d+)/([^/]+)/?$" />
        <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="cat/sub-cat/detail.aspx?id={R:2}" />
      </rule>

在C#代码中,我需要读出第二组模式(即我的ID)中的值,以便我的书签按钮(不要问)处理这样的动态页面。我使用的是一个在发布时做事情的CMS,我们错过了动态内容的书签

因此,我所做的是将web.config作为XML加载,并根据
match
元素的
URL
属性中的内容匹配当前URL。然而,我不知道如何进入这个团队。记住,这需要是通用的,因此在另一条规则中,该组可以是第三组或第一组

我有一个白名单的规则,我这样做是违反的


我尝试使用捕获组
(?\d+)
,但web.config不允许使用它们。

使用命名组的想法似乎是解决规则灵活性的一个相当好的方法。我目前无权在IIS上测试重写规则,但您可能希望尝试使用替代方法命名捕获的组。也许那会过去

请尝试此替代模式,它使用单引号代替尖括号:

(?'id'\d+)

我解决这个问题的方法是使用IIS7 URL重写模块的服务器变量功能


我定义了一个新的允许的服务器变量,然后使用IIS URL重写语法
{R:2}
捕获了这样需要的值。然后,我可以使用
HttpContext.Request.ServerVariables
集合访问该值。

我尝试了此操作,但IIS不允许使用语法-我得到一个500错误。它在我的单元测试中运行得很好,但是没有IIS参与。所以我学会了一种新的语法:-)+1很酷,很高兴你明白了。所以这种方法不依赖于命名组,只依赖于
{R:2}
变量?无论团队的位置如何(如您所述,第一组或第三组),这都有效吗?您应该将此标记为答案。是的,它更加优雅,因为我可以更改用于填充服务器变量的捕获组,例如,{R:1},{R:2},基于每个重写规则,而无需更改后端代码。