在混合路由方案中,哪个路由器先处理传入请求

时间:2020-06-29 12:10:36

标签: asp.net-core asp.net-routing

对于传统的路由,我知道请求首先到达mvcmiddleware,然后路由器会将请求与预定义的模板进行比较。

如果找到匹配的路由,则将从请求中提取路由值,并将其分配给所选模板的路由参数。然后,控制器和操作路线参数将用于查找请求的路线。

另一方面,属性路由是在运行时计算出URL并将其作为键值对和相关操作存储在字典中的,当请求到达mvcmiddleware时,它会检查请求url是否为字典并调用相关的操作。

但是当请求到达mvcmiddleaware时,我们已经定义了两种路由类型,哪个路由器倾向于首先处理该请求?

1 个答案:

答案 0 :(得分:1)

根据我的理解,常规路由和基于属性的路由都使用中间件。我假设路由规则评估遵循中间件注册。因此,如果首先配置了基于路由的中间件(<Page.Resources> <Style x:Key="ListViewItemContainerStyle1" TargetType="ListViewItem"> <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/> <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/> <Setter Property="Background" Value="{ThemeResource ListViewItemBackground}"/> <Setter Property="Foreground" Value="{ThemeResource ListViewItemForeground}"/> <Setter Property="TabNavigation" Value="Local"/> <Setter Property="IsHoldingEnabled" Value="True"/> <Setter Property="Padding" Value="12,0,12,0"/> <Setter Property="HorizontalContentAlignment" Value="Left"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/> <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/> <Setter Property="AllowDrop" Value="False"/> <Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}"/> <Setter Property="FocusVisualMargin" Value="0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListViewItem"> <ListViewItemPresenter x:Name="Root" FocusVisualPrimaryThickness="0" CheckBrush="{ThemeResource ListViewItemCheckBrush}" ContentMargin="{TemplateBinding Padding}" CheckBoxBrush="{ThemeResource ListViewItemCheckBoxBrush}" ContentTransitions="{TemplateBinding ContentTransitions}" CheckMode="{ThemeResource ListViewItemCheckMode}" DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}" DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}" DragBackground="{ThemeResource ListViewItemDragBackground}" DragForeground="{ThemeResource ListViewItemDragForeground}" FocusBorderBrush="{ThemeResource ListViewItemFocusBorderBrush}" FocusVisualMargin="{TemplateBinding FocusVisualMargin}" FocusSecondaryBorderBrush="{ThemeResource ListViewItemFocusSecondaryBorderBrush}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Control.IsTemplateFocusTarget="True" PressedBackground="{ThemeResource ListViewItemBackgroundPressed}" PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackground}" PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}" PointerOverBackground="{ThemeResource ListViewItemBackgroundPointerOver}" RevealBorderThickness="{ThemeResource MenuFlyoutItemRevealBorderThickness}" ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" RevealBorderBrush="{ThemeResource ListViewItemRevealBorderBrush}" RevealBackground="{ThemeResource ListViewItemRevealBackground}" SelectedForeground="{ThemeResource ListViewItemForegroundSelected}" SelectionCheckMarkVisualEnabled="{ThemeResource ListViewItemSelectionCheckMarkVisualEnabled}" SelectedBackground="Red" SelectedPressedBackground="{ThemeResource ListViewItemBackgroundSelectedPressed}" SelectedPointerOverBackground="{ThemeResource ListViewItemBackgroundSelectedPointerOver}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"/> <VisualState x:Name="Selected"> <VisualState.Setters> <Setter Target="Root.RevealBorderThickness" Value="2"/> <Setter Target="Root.RevealBorderBrush" Value="Green"/> </VisualState.Setters> </VisualState> <VisualState x:Name="PointerOver"> <VisualState.Setters> <Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/> <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPointerOver}"/> </VisualState.Setters> </VisualState> <VisualState x:Name="PointerOverSelected"> <VisualState.Setters> <Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/> <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPointerOver}"/> </VisualState.Setters> </VisualState> <VisualState x:Name="PointerOverPressed"> <VisualState.Setters> <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/> <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/> </VisualState.Setters> </VisualState> <VisualState x:Name="Pressed"> <VisualState.Setters> <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/> <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/> </VisualState.Setters> </VisualState> <VisualState x:Name="PressedSelected"> <VisualState.Setters> <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/> <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/> </VisualState.Setters> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="DisabledStates"> <VisualState x:Name="Enabled"/> <VisualState x:Name="Disabled"> <VisualState.Setters> <Setter Target="Root.RevealBorderThickness" Value="0"/> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </ListViewItemPresenter> </ControlTemplate> </Setter.Value> </Setter> </Style> </Page.Resources> <Grid> <ListView Width="300" ItemContainerStyle="{StaticResource ListViewItemContainerStyle1}"> <ListViewItem>123</ListViewItem> <ListViewItem>234</ListViewItem> </ListView> </Grid> ),则应首先评估其规则。

为了确保首先评估哪个,我建议使用路由调试器,例如thisblog post。通过调用UseRouting,您将能够在响应头中看到已解决的路由规则。