Press ESC to close

asp.net core, Kayıt edilmiş route listesini alma

Arkadaşlar merhaba, bugün bir projemde statik olarak register edilmiş olan bütün routelara erişmem gerekti, fakat çözümü bulmak düşündüğüm kadar hızlı olmadı.

Öncelikle eski bir .net projesinin .net 6’ya dönüşümü üzerinde çalışıyordum.

Dönüşümün ardından sitemap dosyasında dinamik olmayan içeriklerin gösterilmesi gibi bir gereksinim doğdu. Bunun için de route listesine ulaşıp, parametrik olmayan değerleri bulmam gerekiyordu.
Öncelikle internette _actionDescriptorCollectionProvider aracılığı ile erişebileceğinizi belirten bir çok yazı var. Aşağıda kodları eklediğim yöntem eğer ki Route attribute ile mapleme yapıyorsanız işe yarıyor.

public class RouteInfoController : Controller
{
    // for accessing conventional routes...
    private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

    public RouteInfoController(
        IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
    {
        _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }

    public IActionResult Index()
    {
        StringBuilder sb = new StringBuilder();

        foreach (ActionDescriptor ad in _actionDescriptorCollectionProvider.ActionDescriptors.Items)
        {
            var action = Url.Action(new UrlActionContext()
            {
                Action = ad.RouteValues["action"],
                Controller = ad.RouteValues["controller"],
                Values = ad.RouteValues
            });

            sb.AppendLine(action).AppendLine().AppendLine();
        }

        return Ok(sb.ToString());
    }

Fakat benim projemde aşağıdaki şekilde map edilen 20ye yakın route bulunuyor.

app.MapControllerRoute("contact",
"en/contact",
new { controller = "Contact", action = "Index" }

Hal böyle olunca farklı bir yöntem bulmaya çalıştım ve sonunda aşağıdaki yönetimi buldum.

{
    public class SitemapController : BaseController
    {
        private readonly IEnumerable<EndpointDataSource> _endpointSources;

        public SitemapController(IEnumerable<EndpointDataSource> endpointSources)
        {
            _endpointSources = endpointSources;
        }

        public IActionResult Index()
        {
            var myRoutes = _endpointSources
                .SelectMany(es => es.Endpoints)
                .Select(x=> (RouteEndpoint)x)
                .Select(x=>x.RoutePattern.RawText)
                .ToList();
            return Ok();
        }
    }
}

Hepinize keyifli çalışmalar diliyorum.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir