国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ASP.NET Core: TemplateMatcher 忽略類型約束問題的解決方法

在使用ASP.NET Core中的TemplateMatcher解決route template匹配字符串問題時(shí),遇到的一個(gè)新問題:匹配時(shí)忽略類型約束。我們將通過分析源代碼和查找相關(guān)線索,提供一種解決方案來解決這個(gè)問題。

ASP.NET Core

引言

在使用ASP.NET Core開發(fā)Web應(yīng)用程序時(shí),我們經(jīng)常需要進(jìn)行URL路由的匹配。ASP.NET Core提供了TemplateMatcher類,它可以幫助我們實(shí)現(xiàn)route template與URL路徑的匹配。然而,在使用TemplateMatcher解決一些基本的route template匹配問題后,我們發(fā)現(xiàn)了一個(gè)新的問題:當(dāng)route template中包含類型約束(即inline constraint)時(shí),匹配過程會(huì)忽略這些類型約束。本文將介紹如何解決這個(gè)問題。

使用 TemplateMatcher 的實(shí)現(xiàn)代碼如下:

var routeTemplate = TemplateParser.Parse(template);                
var values = new RouteValueDictionary();
var matcher = new TemplateMatcher(routeTemplate, values);
if (matcher.TryMatch(path, values))
{
    return new KeyValuePair<string, RouteValueDictionary>(template, values);
}

分析

我們首先需要了解TemplateMatcher是如何進(jìn)行路由匹配的。在TemplateMatcher的實(shí)現(xiàn)代碼中,我們可以看到它使用了TemplateParser來解析route template,并將解析結(jié)果傳遞給TemplateMatcher進(jìn)行匹配。然而,在TemplateParser.Parse方法返回的解析結(jié)果中,并沒有提供對類型約束的支持。

解決方案

通過查看ASP.NET Core的源代碼,我們發(fā)現(xiàn)在IntRouteConstraintsTests.cs#L22和ConstraintsTestHelper.cs#L8中有一些重要的線索,我們可以利用這些線索來解決這個(gè)問題。

首先,我們可以使用下面的代碼將TemplateParser.Parse方法返回結(jié)果中的InlineConstraints打印出來:

var routeTemplate = "/{blogApp}/{postType}/{id:int}/{**slug}";
var parsedTemplate = TemplateParser.Parse(routeTemplate);
var values = new RouteValueDictionary();
foreach (var parameter in parsedTemplate.Parameters)
{
    foreach (var inlineConstraint in parameter.InlineConstraints)
    {
        Console.WriteLine(parameter.Name + ":" + inlineContraint.Constraint);
    }
}

輸出:

id:int

從輸出結(jié)果中我們可以看到,InlineConstraints中包含了類型約束的信息。接下來,我們需要?jiǎng)?chuàng)建一個(gè)IRouteConstraint的實(shí)例,并將解析出的類型約束傳遞給它。我們可以使用以下代碼創(chuàng)建IRouteConstraint實(shí)例:

IServiceCollection services = new ServiceCollection();
services.AddOptions<RouteOptions>();
using ServiceProvider sp = services.BuildServiceProvider();
var routeOptions = sp.GetRequiredService<IOptions<RouteOptions>>();
var constraintResolver = new DefaultInlineConstraintResolver(routeOptions, sp);

var routeConstraint = constraintResolver.ResolveConstraint(inlineContraint.Constraint);
Console.WriteLine(routeContraint);

輸出:

Microsoft.AspNetCore.Routing.Constraints.IntRouteConstraint

通過以上代碼,我們成功創(chuàng)建了一個(gè)IntRouteConstraint的實(shí)例。現(xiàn)在我們可以將這個(gè)實(shí)例用于匹配過程中。

接下來,我們可以使用以下代碼演示如何使用TemplateMatcher進(jìn)行URL路徑的匹配,并考慮到類型約束:

using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Template;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

var routeTemplates = new[]
{
    "/{blogApp}/{postType}/{id:int}/{**slug}",
    "/{blogApp}/{postType}/{idOrSlug}.html"
};

var url = "http://www.zghlxwxcb.cn/diary/problem/681.html";
var urlPath = new Uri(url).AbsolutePath;

IServiceCollection services = new ServiceCollection();
services.AddOptions<RouteOptions>();
using ServiceProvider sp = services.BuildServiceProvider();
var routeOptions = sp.GetRequiredService<IOptions<RouteOptions>>();
var constraintResolver = new DefaultInlineConstraintResolver(routeOptions, sp);

foreach (string routeTemplate in routeTemplates)
{
    Console.WriteLine("routeTemplate: " + routeTemplate);
    var parsedTemplate = TemplateParser.Parse(routeTemplate);

    var values = new RouteValueDictionary();
    var matcher = new TemplateMatcher(parsedTemplate, values);
    if (matcher.TryMatch(urlPath, values))
    {
        Console.WriteLine("TemplateMatcher matched: true");
        foreach (var item in values)
        {
            Console.WriteLine("{0}: {1}", item.Key, item.Value);
        }

        foreach (var parameter in parsedTemplate.Parameters)
        {
            foreach (var inlineConstraint in parameter.InlineConstraints)
            {
                Console.WriteLine(parameter.Name + ":" + inlineConstraint.Constraint);

                var routeConstraint = constraintResolver.ResolveConstraint(inlineConstraint.Constraint);
                var routeDirection = RouteDirection.IncomingRequest;
                bool matched = routeConstraint!.Match(httpContext: null, route: null, parameter.Name!, values, routeDirection);

                Console.WriteLine($"{routeConstraint.GetType().Name} matched: {matched}");
                Console.WriteLine();
            }
        }
    }
}

輸出:

routeTemplate: /{blogApp}/{postType}/{id:int}/{**slug}
TemplateMatcher matched: true
blogApp: diary
postType: problem
id: 681.html
slug:
id:int
IntRouteConstraint matched: False

routeTemplate: /{blogApp}/{postType}/{idOrSlug}.html
TemplateMatcher matched: true
blogApp: diary
postType: problem
idOrSlug: 681.html

通過以上代碼,我們可以看到TemplateMatcher成功匹配了URL路徑,并正確應(yīng)用了類型約束。在第一個(gè)匹配的例子中,我們使用了"/{blogApp}/{postType}/{id:int}/{**slug}"的route template,其中id參數(shù)被指定為整數(shù)類型約束。在匹配過程中,我們可以看到IntRouteConstraint成功被應(yīng)用,并返回了匹配結(jié)果。

結(jié)論

通過分析源代碼和查找相關(guān)線索,我們成功解決了TemplateMatcher忽略類型約束的問題。我們使用DefaultInlineConstraintResolver創(chuàng)建了一個(gè)IRouteConstraint的實(shí)例,并將解析出的類型約束傳遞給它。這樣,在進(jìn)行URL路徑匹配時(shí),TemplateMatcher會(huì)正確應(yīng)用類型約束,從而得到準(zhǔn)確的匹配結(jié)果。

ASP.NET Core的TemplateMatcher是一個(gè)強(qiáng)大的工具,可以幫助我們處理URL路由的匹配。然而,在使用它時(shí),我們需要注意到一些潛在的問題,比如忽略類型約束。通過本文提供的解決方案,我們能夠充分利用TemplateMatcher的功能,并確保類型約束得到正確應(yīng)用。

注意

以上代碼僅為示例,可能需要根據(jù)您的實(shí)際需求進(jìn)行適當(dāng)修改。

可以參考以下資料:文章來源地址http://www.zghlxwxcb.cn/article/681.html

[Stack Overflow](stackoverflow.com)
[Microsoft Documentation](docs.microsoft.com/en-us/aspnet/core/?view=aspnetcore-5.0)

到此這篇關(guān)于ASP.NET Core: TemplateMatcher 忽略類型約束問題的解決方法的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/681.html

如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請聯(lián)系站長進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • asp.net core 6中跨域問題

    1.在使用 .net 6 開發(fā)WEBAPI程序時(shí),出現(xiàn)跨域問題?。原來的寫法不能用了。用下面的寫法解決問題 builder.Services.AddCors(options = { ?? ?options.AddPolicy(\\\"any\\\", builder = ?? ?{ ?? ??? ?builder.SetIsOriginAllowed(_ = true).AllowAnyMethod().AllowAnyHeader().AllowCredentials(); ?? ?}); });? ?app.UseCors(\\\"any\\\");

    2024年02月16日
    瀏覽(89)
  • ASP.NET core WebApi Cors跨域解決

    ASP.NET core WebApi Cors跨域解決

    我用了最新版的Asp.net webapi ,在csdn上面搜跨域如何解決的時(shí)候,發(fā)現(xiàn)csdn上面對于.NET技術(shù)討論不是很多。沒辦法,只能面向官方文檔和GitHub編程了。 前面兩個(gè)已經(jīng)放棄維護(hù)了,我們就不用了。用最新的webApi 我們引入了最新的api后可以在官方網(wǎng)址上查看文檔(有些地址是gitH

    2024年04月29日
    瀏覽(93)
  • 一個(gè)基于ASP.NET Core完全開源的CMS 解決方案

    一個(gè)基于ASP.NET Core完全開源的CMS 解決方案

    MixCore CMS是一個(gè)基于.NET Core框架的開源內(nèi)容管理系統(tǒng)(CMS),提供了豐富的的基礎(chǔ)功能和插件,是一款面向未來的企業(yè) Web? CMS ,可輕松構(gòu)建任何類型的應(yīng)用程序。集成了Google Analytics分析,以及友好的Seo功能,非常適合用于創(chuàng)建企業(yè)網(wǎng)站、內(nèi)容系統(tǒng)、個(gè)人博客,也可以用于開發(fā)

    2024年02月05日
    瀏覽(110)
  • bug筆記:解決 HTTP Error 500.30 - ASP.NET Core app failed to start

    bug筆記:解決 HTTP Error 500.30 - ASP.NET Core app failed to start

    總結(jié)下后端部署windos?iis環(huán)境net6版本,500.30問題報(bào)錯(cuò)的一種解決方案: 檢查下是否安裝了net6對應(yīng)的環(huán)境,是否已經(jīng)安裝 然后在事件管理器Windows日志應(yīng)用程序,里面查看詳細(xì)異常記錄 在iis下面找到部署的后端,找到右側(cè)欄的編輯權(quán)限,給Everyone用戶授權(quán)。

    2024年01月20日
    瀏覽(94)
  • ASP.NET Core教程:ASP.NET Core 程序部署到Windows系統(tǒng)

    ASP.NET Core教程:ASP.NET Core 程序部署到Windows系統(tǒng)

    本篇文章介紹如何將一個(gè)ASP.NET Core Web程序部署到Windows系統(tǒng)上。這里以ASP.NET Core WebApi為例進(jìn)行講解。首先創(chuàng)建一個(gè)ASP.NET Core WebApi項(xiàng)目,使用默認(rèn)的Values控制器,這里使用Visual Studio 2019創(chuàng)建一個(gè)ASP.NET Core 3.1d的WebApi項(xiàng)目。 創(chuàng)建新項(xiàng)目的時(shí)候選項(xiàng)ASP.NET Core Web應(yīng)用程序,如下圖所

    2023年04月08日
    瀏覽(99)
  • ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    右鍵單擊“視圖”文件夾,然后單擊“添加”“新文件夾”,并將文件夾命名為“HelloWorld”。 右鍵單擊“Views/HelloWorld”文件夾,然后單擊“添加”“新項(xiàng)”。 在“添加新項(xiàng) - MvcMovie”對話框中: 在右上角的搜索框中,輸入“視圖” 選擇“Razor 視圖 - 空” 保持“名稱”框的

    2024年02月13日
    瀏覽(124)
  • ASP.NET和ASP.NET Core的區(qū)別

    ASP.NET和ASP.NET Core是兩個(gè)不同的Web應(yīng)用程序框架,它們都是由Microsoft開發(fā)的。ASP.NET是Microsoft推出的第一個(gè)Web應(yīng)用程序框架,而ASP.NET Core是其最新版本。本文將介紹ASP.NET和ASP.NET Core的簡介和區(qū)別。 ASP.NET的簡介 ASP.NET是一個(gè)基于.NET框架的Web應(yīng)用程序框架,它是Microsoft推出的第一

    2024年02月16日
    瀏覽(93)
  • Asp.Net VS ASP.NET Core 請求管道

    Asp.Net VS ASP.NET Core 請求管道

    參考鏈接 ASP.NET CORE 啟動(dòng)過程及源碼解讀 請求進(jìn)入Asp.Net工作進(jìn)程后,由進(jìn)程創(chuàng)建HttpWorkRequest對象,封裝此次請求有關(guān)的所有信息,然后進(jìn)入HttpRuntime類進(jìn)行進(jìn)一步處理。HttpRuntime通過請求信息創(chuàng)建HttpContext上下文對象,此對象將貫穿整個(gè)管道,直到響應(yīng)結(jié)束。同時(shí)創(chuàng)建或從應(yīng)用

    2024年02月04日
    瀏覽(97)
  • 【ASP.NET Core 基礎(chǔ)知識(shí)】--最佳實(shí)踐和進(jìn)階主題--設(shè)計(jì)模式在ASP.NET Core中的應(yīng)用

    一、設(shè)計(jì)模式概述 1.1 什么是設(shè)計(jì)模式 設(shè)計(jì)模式是在軟件設(shè)計(jì)過程中反復(fù)出現(xiàn)的、經(jīng)過驗(yàn)證的、可重用的解決問題的方法。它們是針對特定問題的通用解決方案,提供了一種在軟件開發(fā)中可靠的指導(dǎo)和標(biāo)準(zhǔn)化方法。設(shè)計(jì)模式通常描述了一種在特定情景下的解決方案,包括了問

    2024年02月21日
    瀏覽(825)
  • ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    我之前稍微研究了一下SignalR Core。用起來還行。簡單來說SignalR就是用來解決實(shí)時(shí)通訊的問題的。 ASP.NET Core SingleR:初次體驗(yàn)和簡單項(xiàng)目搭建 SignalR支持三種客戶端,C#,Java,JavaScirpt?;緣蛴昧?。本身就是微軟開發(fā)的,肯定支持自己的語言。因?yàn)槭荳ebsocket的上層封裝,所以也要支

    2024年01月20日
    瀏覽(557)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包