Microsoft.AspNet.Http.HttpRequest से कच्चा URL प्राप्त करें


89

HttpRequestAsp.Net 5 (vNext) में कक्षा जैसे अनुरोध के लिए URL के बारे में पार्स विवरण, (अन्य बातों के साथ) शामिल हैं Scheme, Host, Pathआदि

मैंने अभी तक कहीं भी स्पॉट नहीं किया है, जो मूल अनुरोध URL को उजागर करता है - हालांकि ये केवल पार्स किए गए मान हैं। (पिछले संस्करणों में था Request.Uri)

क्या मुझे HttpRequest पर उपलब्ध घटकों से एक साथ टुकड़ा किए बिना कच्चा URL वापस मिल सकता है?


1
ऐसा प्रतीत होता है कि इस बारे में पहले ही दायर किया जा चुका है लेकिन यह बंद है ... आप शायद इसके विवरण की जांच कर सकते हैं और यदि आप इसके बारे में मजबूत महसूस करते हैं, तो इसे विवरण के साथ अपडेट किया जा सकता है: github.com/aspnet/HttpAbstractions/issues/110
किरण चल्ला

@ किरनचैला: मैं उनकी बात को लेना चाहता हूं, हालांकि यह मुझे आश्चर्यचकित करता है कि रावूर पिछले संस्करणों में क्या है। मुझे लगता है कि वे वर्तमान में योजना के बारे में क्या दिखा रहे हैं, मेजबान आदि को अनुरोध के सर्वर साइड हैंडलिंग से विभाजित किया जा सकता है, और अनुरोध पर कुछ भी नहीं।
जॉन एगर्टन

क्या आपने ToString () की कोशिश की?
अगुआ मंगल

जवाबों:


85

ऐसा लगता है कि आप इसे सीधे एक्सेस नहीं कर सकते, लेकिन आप इसे फ्रेमवर्क का उपयोग करके बना सकते हैं:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

आप विस्तार विधि के रूप में भी उपरोक्त का उपयोग कर सकते हैं।

यह एक के stringबजाय एक रिटर्न देता है Uri, लेकिन यह उद्देश्य की सेवा करना चाहिए! (यह भी, की भूमिका की सेवा करने लगता UriBuilderहै।)

@Mswietlicki को यह इंगित करने के लिए धन्यवाद कि यह गायब होने के बजाय केवल रिफैक्ट हो गया है! और मेरे उत्तर में नाम स्थान परिवर्तन को इंगित करने के लिए @CF को भी!


4
यह अब बीटा -5 के रूप में काम नहीं करता है। मेरे पास एक अच्छा विकल्प नहीं है या मैं अपने उत्तर को अपडेट करूंगा।
मैट डेके

13
मेरा मानना ​​है कि यह एक सच्चा विस्तार तरीका था - आप बस अपने उपयोग के मामले के आधार पर GetEncodedUriया तो नाम स्थान और कॉल आयात करते हैं या GetDisplayUri
dlras2 2

43
Microsoft.AspNet.Http.Extensions का उपयोग करना; और वह Request.GetDisplayUrl ()
mswietlicki

8
सही नाम स्थान अब Microsoft.AspNetCore.Http.Extensions
CF

9
ASP.NET Core 1.0 के लिए अपने रेजर दृश्य में "Microsoft.AspNetCore.Http.Extensions" का उपयोग करें। Url का उपयोग करने के लिए "@ Context.Request.GetDisplayUrl ()"।
जोप

75

Nuget पैकेज जोड़ें / उपयोग करें:

using Microsoft.AspNetCore.Http.Extensions; 

(ASP.NET कोर RC1 में यह Microsoft.AspNet.Http.Extensions में था)

तब आप पूर्ण HTTP अनुरोध यूआरएल को निष्पादित करके प्राप्त कर सकते हैं:

var url = httpContext.Request.GetEncodedUrl();

या

var url = httpContext.Request.GetDisplayUrl();

उद्देश्यों पर निर्भर करता है।


ASP.NET Core RC2 अब उपलब्ध है?
सेर्गेई जी।


स्रोत को देखते हुए, ये स्पष्ट रूप से कुछ एन्कोडिंग / डिकोडिंग करते हैं, इसलिए यह कच्चा url नहीं होगा। इसके अलावा, IIS कभी-कभी url को बदल देगा, इससे पहले कि वह Kestrel जैसे% 2F -> / में बदल जाए।
डैनियल लीच

1
@TomStickel यकीन नहीं होता कि आप किस बारे में बात कर रहे हैं ... मेरे पास दोनों में से कोई भी मुद्दा नहीं था। सुनिश्चित करें कि आपके पास usingउत्तर में वर्णित के रूप में आप फ़ाइल में निर्देश हैं, क्योंकि ये "सामान्य" तरीके नहीं हैं, बल्कि विस्तार के तरीके हैं।
निक मेर्टिन

1
@TomStickel मेला। बस यह देखते हुए कि ASP.NET Core 2.2 (2.0 पर भी परीक्षण किया गया) के लिए Microsoft.AspNetCore.All पैकेज स्थापित किया गया है, यह मेरे लिए ठीक काम करता है।
निक मेर्टिन

16

यदि आप वास्तव में वास्तविक, कच्चा URL चाहते हैं , तो आप निम्नलिखित एक्सटेंशन विधि का उपयोग कर सकते हैं:

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

यह विधि RawTargetअनुरोध का उपयोग करती है, जो HttpRequestवस्तु पर ही सामने नहीं आती है। यह संपत्ति ASP.NET कोर के 1.0.0 रिलीज में जोड़ी गई थी। सुनिश्चित करें कि आप वह या नया संस्करण चला रहे हैं।

ध्यान दें! यह संपत्ति कच्चे URL को उजागर करती है , इसलिए इसे डिकोड नहीं किया गया है, जैसा कि प्रलेखन द्वारा उल्लेख किया गया है:

इस संपत्ति का उपयोग आंतरिक रूप से रूटिंग या प्राधिकरण निर्णयों के लिए नहीं किया जाता है। यह UrlDecoded नहीं किया गया है और इसके उपयोग में देखभाल की जानी चाहिए।


मैं पूर्ण .NET फ्रेमवर्क के साथ ASP .NET कोर का उपयोग कर रहा हूं। यह मेरे लिए काम नहीं करता है ( RawTargetपर परिभाषित नहीं है IHttpRequestFeature)। क्या आप कोई विकल्प सोच सकते हैं?
टॉम हबलबोरर

1
RawTarget1.0 रिलीज में जोड़ा गया था, वापस मई में हो सकता है । क्या आप वाकई नवीनतम संस्करण पर चल रहे हैं?
khellang

1
यदि IIS का उपयोग करके होस्ट किया जाता है, तो IIS Kestrel में जाने से पहले कभी-कभी url बदल देगा। इसका एक उदाहरण% 2F है / को डिकोड हो जाता है।
डैनियल लीच

यह अब तक का आधिकारिक जवाब है।
क्रिस मैरिसिक

यह पूरे URL के बजाय URL पथ देता प्रतीत होता है
Iain Ballard

12

.NET कोर रेजर में:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

आप दूसरी पंक्ति के बजाय उपयोग कर सकते हैं:

@Context.Request.GetDisplayUrl() //Use to display the URL only

9

अन्य समाधान मेरी आवश्यकताओं के लिए अच्छी तरह से फिट नहीं थे क्योंकि मैं सीधे एक URIवस्तु चाहता था और मुझे लगता है कि इस मामले में स्ट्रिंग समालोचना (भी) से बचने के लिए बेहतर है, इसलिए मैंने इस विस्तार विधियों का उपयोग करने की तुलना में बनाया UriBuilderऔर उरल्स के साथ काम करता है जैसे http://localhost:2050:

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

1
अच्छा था। इसके अलावा, मैंने आपके समाधान को वैकल्पिक मापदंडों के साथ बेहतर बनाया है। इसलिए मैं नियंत्रित कर सकता हूं कि मैं यूआरआई के किस हिस्से को वापस लेना चाहता हूं। उदाहरण के लिए, क्वेरी स्ट्रिंग आदि के बिना केवल या पूर्ण पथ होस्ट करें
user3172616

@ user3172616 अच्छा विचार!
जियामिन

1
(80)होना चाहिए (-1)। आप https "होस्ट" शीर्षक यह गलत उरी उत्पन्न होगा (जैसे में छोड़े गए पोर्ट के साथ योजना है जब https://myweb:80/, साथ (-1)यह हो जाएगा https://myweb)।
इगोर ड्रूसी 14

4

निम्नलिखित विस्तार विधि पूर्व-बीटा 5 से तर्क को पुन: पेश करती है UriHelper:

public static string RawUrl(this HttpRequest request) {
    if (string.IsNullOrEmpty(request.Scheme)) {
        throw new InvalidOperationException("Missing Scheme");
    }
    if (!request.Host.HasValue) {
        throw new InvalidOperationException("Missing Host");
    }
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
    return request.Scheme + "://" + request.Host + path + request.QueryString;
}

3

यह एक्सटेंशन मेरे लिए काम करता है:

Microsoft.AspNetCore.Http का उपयोग करना;

    public static class HttpRequestExtensions
    {
        public static string GetRawUrl(this HttpRequest request)
        {
            var httpContext = request.HttpContext;
            return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
        }
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.