MVC 3 में वर्तमान पृष्ठ URL कैसे प्राप्त करें


360

मैं जिस ब्लॉग का निर्माण कर रहा हूं, उस पर फेसबुक टिप्पणियों के प्लगइन का उपयोग कर रहा हूं। इसमें कुछ एफबीएक्सएमएल टैग हैं जिनकी व्याख्या फेसबुक जावास्क्रिप्ट द्वारा की गई है जो पृष्ठ पर संदर्भित है।

यह सब ठीक काम करता है, लेकिन मुझे प्लगइन में वर्तमान, पूरी तरह से योग्य URL पास करना होगा।

<div style="width: 900px; margin: auto;">
    <div id="fb-root"></div>
    <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>

वर्तमान पृष्ठ का URL प्राप्त करने का सबसे अच्छा तरीका क्या है? अनुरोध URL।

समाधान

यहाँ मेरे समाधान का अंतिम कोड है:

<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>

जवाबों:


533

आप , या Request.RawUrl, का उपयोग कर सकते हैं ।Request.Url.OriginalStringRequest.Url.ToString()Request.Url.AbsoluteUri


2
किसी कारण से, यह संपूर्ण URL प्राप्त नहीं करता है, बस डोमेन के बाद सब कुछ।
Chev

6
@Chevex, कैसे Request.Url.ToString()या के बारे में Request.Url.AbsoluteUri?
डारिन दिमित्रोव

9
लगभग। Request.Url.AbsoluteUriकिया था :)
Chev

2
@Chevex - साइट को किस पोर्ट पर होस्ट किया गया है? यदि यह पोर्ट 80 है तो, हाँ, आप एक नहीं देखेंगे। मैं कह रहा हूँ कि ऐसा माहौल एक आभासी आईपी एक पर एक या अधिक मशीनों को पोर्ट 80 का प्रकाशन वहाँ में अलग बंदरगाह (जैसे 81) तो Asp.Net हमेशा जोड़ देगा: यूआरएल के लिए 81 को गलत तरीके से
एनड्रास ज़ोल्टन

29
विभिन्न url अंशों के नमूने प्राप्त करने के लिए इस पर एक नज़र डालें: cambiaresearch.com/articles/53/…
ms007

48

इस विस्तार विधि को अपने कोड में जोड़ें:

public static Uri UrlOriginal(this HttpRequestBase request)
{
  string hostHeader = request.Headers["host"];

  return new Uri(string.Format("{0}://{1}{2}",
     request.Url.Scheme, 
     hostHeader, 
     request.RawUrl));
}

और फिर आप इसे बंद कर सकते RequestContext.HttpContext.Requestहैं संपत्ति।

Asp.Net में एक बग (साइड-स्टेप्ड, नीचे देखें) हो सकता है जो उन मशीनों पर उत्पन्न होता है जो स्थानीय वेबसाइट के लिए पोर्ट 80 के अलावा अन्य पोर्ट का उपयोग करते हैं (एक बड़ा मुद्दा अगर आंतरिक वेब साइटों को वर्चुअल आईपी पर लोड-बैलेंसिंग के माध्यम से प्रकाशित किया जाता है और बंदरगाहों का उपयोग आंतरिक रूप से नियमों को प्रकाशित करने के लिए किया जाता है) जिससे Asp.Net हमेशाAbsoluteUri संपत्ति पर पोर्ट जोड़ देगा - भले ही मूल अनुरोध इसका उपयोग न करें।

यह कोड सुनिश्चित करता है कि लौटाया गया url हमेशा किसी भी लोड-बैलेंसिंग आदि के होने से पहले मूल रूप से अनुरोध किए गए ब्राउज़र (पोर्ट सहित - जैसे कि इसे होस्ट हेडर में शामिल किया जाएगा) के बराबर होता है।

कम से कम, यह हमारे (बल्कि जटिल!) वातावरण में करता है :)

यदि बीच में हेडर को फिर से लिखने के बीच में कोई फंकी प्रॉक्सी हैं, तो यह भी काम नहीं करेगा।

अद्यतन 30 जुलाई 2013

जैसा कि नीचे दिए गए टिप्पणियों में @KevinJones द्वारा उल्लेख किया गया है - मैं अगले भाग में जिस सेटिंग का उल्लेख करता हूं, उसे यहां प्रलेखित किया गया है: http://msdn.microsoft.com/en-us/library/hh975440.aspx

हालांकि मुझे कहना है कि जब मैंने इसे आज़माया तो मुझे यह काम नहीं मिला - लेकिन यह सिर्फ मुझे टाइपो या कुछ बनाने के लिए हो सकता है।

अपडेट 9 जुलाई 2012

मैं थोड़ी देर पहले इस पर आया था, और इस उत्तर को अपडेट करने का मतलब था, लेकिन कभी नहीं किया। जब एक उत्थान बस इस जवाब पर आया तो मैंने सोचा कि मुझे इसे अभी करना चाहिए।

Asp.Net में जिस 'बग' का मैं उल्लेख करता हूं, उसे जाहिरा तौर पर अनपेक्षित एपसेटिंग मूल्य के साथ नियंत्रित किया जा सकता है - जिसे 'aspnet:UseHostHeaderForRequest'- (यानी):

<appSettings>
  <add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>

HttpRequest.UrlILSpy में देखते हुए मुझे यह पता चला - --->उस ILSpy दृश्य से निम्नलिखित प्रतिलिपि / पेस्ट के बाईं ओर इंगित किया गया :

public Uri Url
{
  get
  {
    if (this._url == null && this._wr != null)
    {
      string text = this.QueryStringText;
      if (!string.IsNullOrEmpty(text))
      {
        text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text, 
          this.QueryStringEncoding);
      }
 ---> if (AppSettings.UseHostHeaderForRequestUrl)
      {
        string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
        try
        {
          if (!string.IsNullOrEmpty(knownRequestHeader))
          {
            this._url = new Uri(string.Concat(new string[]
            {
              this._wr.GetProtocol(),
              "://",
              knownRequestHeader,
              this.Path,
              text 
            }));
          }
        }
        catch (UriFormatException)
        { }
     }
     if (this._url == null) { /* build from server name and port */
       ...

मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है - यह अनिर्दिष्ट है और इसलिए इसके चारों ओर छड़ी करने की गारंटी नहीं है - हालांकि यह वही काम कर सकता है जिसका मैं ऊपर उल्लेख करता हूं। खोज परिणामों में प्रासंगिकता बढ़ाने के लिए - और स्वीकार करने के लिए किसी और को, जो seeems इस खोज की है करने के लिए - सेटिंग भी ट्विटर पर निक Aceves से उल्लेख किया गया है'aspnet:UseHostHeaderForRequest'


ठीक है तो आप कहाँ या कैसे हो रहे हैं HttpRequestBase के आदमी उदाहरण कह सकते हैं कि क्या आप उदाहरण के लिए किसी नियंत्रक में सीधे कोड के साथ काम नहीं कर रहे थे?
पॉजिटिव

@CopyAddict खैर, mvc3 में आपके पास HttpContext.Current.Request है, क्योंकि Asp.net 4 बेस एब्स्ट्रैक्ट का उपयोग करता है। अगर .net 3.5 या उससे कम पर, आप उसी संपत्ति के आसपास HttpRequestWrapper का उपयोग कर सकते हैं, System.Web.Abstractions से
Andras Zoltan

3
इसके लिए बहुत देर हो चुकी है लेकिन UseHostHeaderForRequestUrl को यहाँ msdn.microsoft.com/en-us/library/hh975440.aspx
केविन जोन्स

अच्छी जगह! कम से कम उन्होंने अंत में इसे 4.5 प्रलेखन के लिए जोड़ा!
एंड्रास ज़ोल्टन


12
Request.Url.PathAndQuery

पूरी तरह से काम करना चाहिए, खासकर यदि आप केवल रिश्तेदार उरी चाहते हैं (लेकिन querystrings रखते हुए)


8

मैं भी फेसबुक कारणों से इसकी तलाश कर रहा था और अब तक दिए गए उत्तरों में से कोई भी आवश्यकतानुसार काम नहीं किया गया है या बहुत जटिल है।

@Request.Url.GetLeftPart(UriPartial.Path)

पूरा प्रोटोकॉल हो जाता है, मेजबान और पथ "बिना" querystring। इसमें पोर्ट भी शामिल है यदि आप डिफ़ॉल्ट 80 के अलावा किसी अन्य चीज का उपयोग कर रहे हैं।


शानदार खोज! मुझे लगता है कि यह पूछने के समय मौजूद नहीं था? मुझे ऐसा लगता है कि मैंने देखा होगा :)
Chev

मुझे लगा कि मैंने देखा कि यह कहाँ जोड़ा गया था लेकिन मैंने अभी-अभी जाँच की है और ऐसा लगता है कि यह .NET 1.1 के बाद से वहाँ है। कौन जाने।
johnw182

4

मेरा मनपसंद...

Url.Content(Request.Url.PathAndQuery)

या केवल...

Url.Action()

Url.Action () केवल url का दाईं ओर प्रदान करता है, यदि आपको पूर्ण url की आवश्यकता है तो क्या होगा?
आलोक

1

एक बात जो अन्य उत्तरों में उल्लिखित नहीं है, वह केस सेंसिटिविटी है, यदि इसे कई स्थानों पर संदर्भित किया जा रहा है (जो कि मूल प्रश्न में नहीं है, लेकिन ध्यान में रखने योग्य है क्योंकि यह प्रश्न बहुत सी समान खोजों में प्रकट होता है )। अन्य उत्तरों के आधार पर मैंने पाया कि शुरू में मेरे लिए काम किया गया था:

Request.Url.AbsoluteUri.ToString()

लेकिन अधिक विश्वसनीय होने के लिए यह तब बन गया:

Request.Url.AbsoluteUri.ToString().ToLower()

और फिर मेरी आवश्यकताओं के लिए (जाँच करें कि साइट किस साइट का नाम एक्सेस कर रही है और संबंधित सामग्री दिखा रही है):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")


यह इसे "अधिक विश्वसनीय" नहीं बनाता है। चाहे यह कितना उपयोगी हो, यह पूरी तरह से इस बात पर निर्भर करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं, और केस-सेंसिटिविटी क्यों समझ में आएगी। आम तौर पर आप करते यूआरएल केस-संवेदी होना चाहता हूँ।
कोडकास्टर

1
@CodeCaster शब्द 'अधिक विश्वसनीय' मेरे अपने अनुभव पर आधारित था, क्योंकि मैं निश्चित रूप से नहीं चाहता कि URL केस संवेदी हो, क्योंकि यह ग्राहकों के लिए समस्याओं का अंत नहीं करता है।
लयाल

0

मेरे लिए यह मुद्दा तब था जब मैंने HTTPContextकंट्रोलर के कंस्ट्रक्टर में पहुंचने की कोशिश की थी, जबकि HTTPContextअभी तैयार नहीं हुआ है। जब इंडेक्स विधि के अंदर चले गए तो यह काम किया:

var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here

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