रूटिंग का उपयोग इनकमिंग रिक्वेस्ट को रूट हैंडलर्स पर मैप करने के लिए किया जाता है। रूट्स को एप्लिकेशन स्टार्टअप पर कॉन्फिगर किया जाता है, और ये URL से मान निकाल सकते हैं जिनका उपयोग रिक्वेस्ट प्रोसेसिंग के लिए किया जाता है।
रूटिंग की मूल बातें
रूटिंग IRouter के इम्प्लीमेंटेशन (रूट्स) का उपयोग करता है:
- इनकमिंग रिक्वेस्ट को रूट हैंडलर्स पर मैप करना
- रिस्पॉन्स में उपयोग के लिए URLs जनरेट करना
रूटिंग RouterMiddleware क्लास द्वारा मिडलवेयर पाइपलाइन से जुड़ा होता है। ASP.NET MVC अपनी कॉन्फिगरेशन के हिस्से के रूप में रूटिंग को मिडलवेयर पाइपलाइन में जोड़ता है।
URL मैचिंग
- इनकमिंग रिक्वेस्ट
RouterMiddlewareमें प्रवेश करती है RouterMiddlewareप्रत्येक रूट पर क्रम सेRouteAsyncमेथड कॉल करता हैIRouterइंस्टेंस तय करता है कि रिक्वेस्ट को हैंडल करना है या नहीं,RouteContext.Handlerको नॉन-नलRequestDelegateपर सेट करके- अगर हैंडलर सेट है, तो रिक्वेस्ट प्रोसेस करने के लिए इनवोक किया जाता है और आगे के रूट्स प्रोसेस नहीं होते
- अगर सभी रूट्स एक्जीक्यूट हो जाते हैं और कोई हैंडलर नहीं मिलता, तो मिडलवेयर
nextकॉल करता है और पाइपलाइन में अगला मिडलवेयर इनवोक होता है
URL जनरेशन
URL जनरेशन एक समान पुनरावृत्त प्रक्रिया का पालन करता है, लेकिन यूजर या फ्रेमवर्क कोड द्वारा रूट कलेक्शन के GetVirtualPath मेथड को कॉल करने से शुरू होता है। प्रत्येक रूट का GetVirtualPath मेथड क्रम से तब तक कॉल किया जाता है जब तक नॉन-नल VirtualPathData वापस नहीं आता।
रूट्स बनाना
रूटिंग Route क्लास को IRouter के स्टैंडर्ड इम्प्लीमेंटेशन के रूप में प्रदान करता है। Route रूट टेम्पलेट सिंटैक्स का उपयोग करके पैटर्न परिभाषित करता है जो RouteAsync कॉल होने पर URL पथ के विरुद्ध मैच होंगे। वही रूट टेम्पलेट GetVirtualPath कॉल होने पर URL जनरेट करने के लिए उपयोग होता है।
रूट टेम्पलेट उदाहरण
// डिफ़ॉल्ट रूट टेम्पलेट
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"
);
टेम्पलेट भागों की व्याख्या:
{controller=Home}- कंट्रोलर सेगमेंट, डिफ़ॉल्ट "Home"{action=Index}- एक्शन सेगमेंट, डिफ़ॉल्ट "Index"{id?}- वैकल्पिक ID पैरामीटर (?वैकल्पिक दर्शाता है)
रूट बनाने के लिए एक्सटेंशन मेथड्स
// पारंपरिक रूटिंग
MapRoute
MapAreaRoute
// एट्रिब्यूट रूटिंग (अधिक सामान्य आधुनिक दृष्टिकोण)
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult Get(int id) { ... }
[HttpPost]
public IActionResult Create(Product product) { ... }
}
एट्रिब्यूट रूटिंग vs पारंपरिक रूटिंग
| विशेषता | पारंपरिक रूटिंग | एट्रिब्यूट रूटिंग |
|---|---|---|
| परिभाषा स्थान | Startup.cs में केंद्रीयकृत | कंट्रोलर/एक्शन पर एट्रिब्यूट्स |
| लचीलापन | सीमित | उच्च - RESTful APIs के लिए बेहतर |
| रखरखाव | बड़े ऐप्स के लिए कठिन | आसान - रूट्स कोड के साथ रहते हैं |
| API के लिए उपयुक्त | नहीं | हां - REST पैटर्न के लिए आदर्श |
रूट कंस्ट्रेंट्स
// इंट कंस्ट्रेंट
[HttpGet("{id:int}")]
// स्ट्रिंग लंबाई कंस्ट्रेंट
[HttpGet("{name:minlength(3):maxlength(20)}")]
// रेगेक्स कंस्ट्रेंट
[HttpGet("{slug:regex(^[a-z0-9-]+$)}")]
// GUID कंस्ट्रेंट
[HttpGet("{id:guid}")]
// कस्टम कंस्ट्रेंट
[HttpGet("{id:mycustomconstraint}")]
आधुनिक ASP.NET Core ( .NET 6+) में: मिनिमल APIs और एंडपॉइंट रूटिंग का उपयोग करें:
var app = WebApplication.CreateBuilder(args).Build();
app.MapGet("/products/{id:int}", (int id) => Results.Ok(GetProduct(id)));
app.MapPost("/products", (Product p) => Results.Created($"/products/{p.Id}", p));
app.Run();