asp.net-core-marsrutizasiya-deep-dive

ASP.NET CORE Marşrutizasiya-Deep Dive

Asp.NET classic ve core platformasının onurğa sütunlarından birini marşrutizasiya prosesi təşkil edir.

Bütün böyük veb frameworklər istifadəçi ilə veb resurslar arasında protokol olaraq rutinq(marşrutizator) istifadə edirlər.Rutinq imkan yaradirki, yaratdığımız veb saytın resurslarını istifadəçi istifadə edə bilsin.


           Asp.Net Core platformasında marşrutizasiya prosesinin əsas məqsədi marşrutizasiya şablonuna uyğun gələn istənilən sorğunu marşrutizasiya emaledicisinə (route handler) yönləndirmək və sorğunun emal olunmasını təmin etməkdən ibarətdir.


Bu proses hesabına 2 cür URL generasiyası prosesi baş tutur:


1)Incoming url ->gələn sorğunun marşrutizasiya kolleksiaysının filterindən keçərək yoxlanılması

2)Outgoing url-> mövcud marşrutizasiya qaydaları əsasında veb səhifədə URL adreslən dinamik generasiyası


           Bu məqalədə Asp.NET CORE platformasının marşrutizasiya prosesi haqda danışacağıq. Növbəti məqalələrdən birində ASP.NET CORE MVC platformasının marşrutizasiya prosesi haqda məlumat verəcəm.

 Marşrutizasiya prosesi digər bir çox funksionallıqlarda olduğu kimi middleware olaraq realizə olunub.

Startup.cs faylında Configure metodu vasitəsilə core platformasının marşrutizasiya prosesini aktiv etmək üçün UseRouter() “funksional əlavə”(extension) metodundan istifadə olunur. Bu metod arqument olaraq IRouter interfeysinin realiasiyasını qəbul edir.

 Core platformasında RouteBuilder klası və birbaşa Router klası vasitəsilə bu interfeysin realizasiyasını almaq olar.

RouteBuilder klası builder şablonu əsasında interfeysin realizasiyasını bizə Build() edərək geri qaytarır.

Bu klasın işini təmin etmək,umumiyyətlə aşağı səviyyəli marşrutizasiya konfiqurasiyaları aparan zaman hər bir marşrutizasiya prosesinin yekunda bir emalediciyə(router) yönləndirilməli olduğunu mütləq bilmək lazımdır. MVC Core platformasında bu emaledici rolunu MvcRouteHandler klası oynayır.

Aşağıdakı kod bloku verilən şablona uyğun istənilən marşrutu emal edərək marşrut emaledicisinə yönləndirir.


Nəticə:



Indi isə daha real praktiki nümunələrə keçək..

                       Asp.NET klasikdə müxtəlif cür sorğuları əsas emaledicidən fərqli emal etmək üçün HttpHandler-lərdən istifadə edirdik.Onların əsas məqsədi standart verilən MVC handle prosesini dəyişmək idi. Asp.NET Core-da da IRouter interfeysi bənzəri funksionallığı yerinə yetirmək üçün istifadə olunur.


Real praktika: Proqram ilə eyni səviyyədə (WebContentRoot) “Data” adlı bir qovluğumuz var.Həmin qovluqda təsəvvür edək ki , avtorizasiya autentifikasiya proseslərinə məruz qalan multimedia-şəkil fayllarımız var. Bildiyimiz kimi standart wwwroot qovluğu bizə bu qovluqdakı fayllara avtorizasiya tətbiq etməyə hələlik imkan vermir. Bununçün bir ayrı qovluq ayırırıq(burada “Data”) və oraya bir neçə şəkillər yükləyirik.

Tapşırıq:

Data qovluğundakı fayllara HomeControlleri üzərindən sadəcə Home/şəklin_adı yazmaqla müraciət etmək istəyirəm.

Yuxarıdakı tapşırığı yerinə yetirmək üçün ilk öncə IRouter interfeysini realizə edirik.Bu interfys bizə iki metod təqdim edir. 


GetVirtualPath() metodu vasitəsilə məqalədə adı qeyd olunan Outgoing url-lər generasiya edirik.Bu prosesdə bizə outgoing url lazım olmadığına görə bu metodu rezalizə etməyəcəyik.Bizi hazırda maraqlandıran əsas metod RouteAsync() metodudur.Bu metod vasitəsilə incoming url generasiya edilir.


public class FileRouter : IRouter

{

    private IHostingEnvironment hostingEnvironment;

    public FileRouter(IHostingEnvironment hostingEnvironment)
    {
        this.hostingEnvironment = hostingEnvironment;
    }

    public VirtualPathData GetVirtualPath(VirtualPathContext context)
    {
      throw new NotImplementedException();
    }
      
       
      
          public Task RouteAsync(RouteContext context)
      
          {
      
              //kod demo xarakterli olduğundan istisnalar(exceptions) emal olunmayıb..
      
              //gələn sorğunun seqmentlərini al.
      
              var path = context.HttpContext.Request.Path.Value.Split('/');
      
      
              //controller və action adlarını al..
                  
      
              RouteData routeData = new RouteData();
      
              routeData.Values["controller"] = path[1];
      
              routeData.Values["action"] = path[2];
      
         
      
              //əgər Home controllerdirsə
      
              if (routeData.Values["controller"].ToString()=="Home")
               
{
      
                  //Data adlı qovluğun yolunu götür..
      
                  var dataFolderPath = Path.Combine(hostingEnvironment.ContentRootPath, "Data");
      
                  //qovluğa kod səviyyəsinə çat
      
                  DirectoryInfo directoryInfo = new DirectoryInfo(dataFolderPath);
      
       
      
                  string actionName = path[2];
      
                  //yoxla əgər qovluqda action adına uyğun faylı qaytar,tapılmasa default null qaytar
      
                 var fileinfo = directoryInfo.GetFiles().Where(x => x.Name.ToLower() == actionName.ToLower()).FirstOrDefault();
      
       
      
                  if (fileinfo!=null)
      
                      //əgər fayl varsa ozaman emaledici tərəfindən sorğunu emal et və istifadəçiyə həmin faylı ver.
      
                      context.Handler = c =>
      
                  {
      
                      return c.Response.SendFileAsync(new SimpleFileInfo(fileinfo));
      
                  };
      
              }
      
            
      
              context.RouteData = routeData;
      
              return Task.FromResult(0);
      
          }
      
      }

Marşrutizasiya emaledicisi sorğunu emal etmək üçün İFileİnfo interfeysinin realizasiyana ehtiyac duyur:

public class SimpleFileInfo : IFileInfo

{

    private FileInfo fullpath;

    public SimpleFileInfo(FileInfo path)

    {

        fullpath = path;

    }

    public bool Exists => fullpath.Exists;

 

    public long Length => fullpath.Length;

 

    public string PhysicalPath => fullpath.FullName;

 

    public string Name => fullpath.Name;

 

    public DateTimeOffset LastModified => fullpath.LastWriteTime;

 

    public bool IsDirectory => false;

 

    public Stream CreateReadStream()

    {

       return new FileStream(fullpath.FullName, FileMode.Open);

    }

}

Sadə formada bu interfeysi realizə etdikdən sonra artıq Configure faylında sonuncu dəyişikliyi edək.

app.UseRouter(new FileRouter(env));

Yekunda nəticə:


Belə.. Növbəti məqalələrimizdən birində birbaşa ASP.NET CORE MVC-nin routing sistemi haqqında danışacağıq.


Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz