RC2 और 1.0 के बादIHttpContextAccessor आपको एक्सटेंशन क्लास में इंजेक्ट करने की आवश्यकता नहीं है । इसके IUrlHelperमाध्यम से तुरंत उपलब्ध है urlhelper.ActionContext.HttpContext.Request। फिर आप एक ही विचार के बाद एक विस्तार वर्ग का निर्माण करेंगे, लेकिन इसमें कोई इंजेक्शन शामिल नहीं होगा।
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = url.ActionContext.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
किसी व्यक्ति के लिए उपयोगी होने के मामले में विवरण का निर्माण करना कि यह एक्सीसर को कैसे इंजेक्ट करता है। आपको वर्तमान अनुरोध के पूर्ण यूआरएल में भी दिलचस्पी हो सकती है, जिस स्थिति में उत्तर के अंत में एक नज़र डालें।
आप IHttpContextAccessorइंटरफ़ेस प्राप्त करने के लिए इंटरफ़ेस का उपयोग करने के लिए अपनी एक्सटेंशन क्लास को संशोधित कर सकते हैं HttpContext। एक बार जब आप संदर्भ है, तो आप प्राप्त कर सकते हैं HttpRequestसे उदाहरण HttpContext.Requestऔर उसके गुणों का उपयोग Scheme, Host, Protocolके रूप में आदि:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
उदाहरण के लिए, आपको अपने वर्ग को HttpContextAccessor से कॉन्फ़िगर करने की आवश्यकता हो सकती है:
public static class UrlHelperExtensions
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
....
}
जो कुछ आप अपनी Startupकक्षा (Startup.cs फ़ाइल) पर कर सकते हैं :
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
आप शायद IHttpContextAccessorअपने विस्तार वर्ग में आने के विभिन्न तरीकों के साथ आ सकते हैं , लेकिन यदि आप अपने तरीकों को अंत में विस्तार विधियों के रूप में रखना चाहते हैं, तो आपको IHttpContextAccessorअपने स्थिर वर्ग में इंजेक्शन लगाने की आवश्यकता होगी । (अन्यथा आपको IHttpContextप्रत्येक कॉल पर तर्क के रूप में आवश्यकता होगी )
बस वर्तमान अनुरोध के निरपेक्षता हो रही है
यदि आप वर्तमान अनुरोध के पूर्ण uri प्राप्त करना चाहते हैं, तो आप विस्तार विधियों GetDisplayUrlया वर्ग GetEncodedUrlसे उपयोग कर सकते हैं UriHelper। (जो उर एल हेल्पर से अलग है )
GetDisplayUrl । अनुरोध URL के संयुक्त घटकों को पूरी तरह से अन-एस्केप किए गए फ़ॉर्म में (क्वेरीरी छोड़कर) केवल प्रदर्शन के लिए उपयुक्त है। इस प्रारूप का उपयोग HTTP हेडर या अन्य HTTP संचालन में नहीं किया जाना चाहिए।
GetEncodedUrl । HTTP हेडर और अन्य HTTP ऑपरेशन में उपयोग के लिए पूरी तरह से बच गए फॉर्म में अनुरोध URL के संयुक्त घटकों को लौटाता है।
उनका उपयोग करने के लिए:
- नाम स्थान शामिल करें
Microsoft.AspNet.Http.Extensions।
HttpContextउदाहरण प्राप्त करें । यह पहले से ही कुछ वर्गों में उपलब्ध है (जैसे कि उस्तरा विचार), लेकिन दूसरों में आपको IHttpContextAccessorऊपर बताए अनुसार इंजेक्शन लगाने की आवश्यकता हो सकती है।
- तो बस उन्हें के रूप में उपयोग करें
this.Context.Request.GetDisplayUrl()
उन तरीकों के लिए एक विकल्प मैन्युअल रूप से HttpContext.Requestवस्तु में मूल्यों का उपयोग करके अपने आप को पूर्ण यूरी क्राफ्टिंग करना होगा (इसी तरह की आवश्यकता है।
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());