এমভিসি 3 এ কীভাবে বর্তমান পৃষ্ঠার URL পাবেন 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>

বর্তমান পৃষ্ঠার ইউআরএল পাওয়ার সর্বোত্তম উপায় কী? অনুরোধ ইউআরএল।

সমাধান

আমার সমাধানের চূড়ান্ত কোডটি এখানে:

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

উত্তর:


533

আপনি ব্যবহার করতে পারে Request.RawUrl, Request.Url.OriginalString, Request.Url.ToString()বা Request.Url.AbsoluteUri


2
কিছু কারণে, এটি পুরো URL টি ডোমেনের পরে সমস্ত কিছু পাবেন বলে মনে হচ্ছে না।
শেভ

6
@ শেভেক্স, কীভাবে Request.Url.ToString()বা Request.Url.AbsoluteUri?
ডারিন দিমিত্রভ

9
প্রায়। Request.Url.AbsoluteUriএটি করেছেন :)
শেভ

2
@ শেভেক্স - সাইটটি কোন বন্দরটিতে হোস্ট করা আছে? যদি এটি 80 বন্দর হয় তবে হ্যাঁ, আপনি কোনওটি দেখতে পাবেন না। আমি বলছি যে এমন একটি পরিবেশে যেখানে ভার্চুয়াল আইপি প্রকাশনা পোর্ট রয়েছে 80 থেকে এক বা একাধিক মেশিনে ভিন্ন ভিন্ন বন্দরে (উদাঃ 81) তারপরে Asp.Net সর্বদা যুক্ত করবে: 81 টি ভুলভাবে ভুলতে হবে
আন্দ্রেস জোল্টান

29
বিভিন্ন ইউআরএল খণ্ডের নমুনাগুলি দেখতে একবার দেখুন: 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 এ একটি বাগ রয়েছে (পাশের ধাপে থাকতে পারে, নীচে দেখুন) (ভার্চুয়াল আইপি-তে লোড-ব্যালান্সিংয়ের মাধ্যমে যদি অভ্যন্তরীণ ওয়েবসাইটগুলি প্রকাশিত হয় তবে একটি বড় সমস্যা) এবং পোর্টগুলি নিয়ম প্রকাশের জন্য অভ্যন্তরীণভাবে ব্যবহৃত হয়) যার মাধ্যমে Asp.Net সর্বদা পোর্টে পোর্ট যুক্ত করবেAbsoluteUri সম্পত্তিটিতে - এমনকি যদি মূল অনুরোধটি এটি ব্যবহার না করে।

এই কোডটি নিশ্চিত করে যে প্রত্যাবর্তিত ইউআরএল মূলত ব্রাউজারের সাথে সর্বদা সমান কোনও লোড-ব্যালেন্সিং ইত্যাদির আগে সংঘটিত হওয়ার আগে অনুরোধ করা (পোর্ট সহ - যেমন এটি হোস্ট শিরোনামে অন্তর্ভুক্ত হবে) এর ।

কমপক্ষে, এটি আমাদের (বরং সংশ্লেষিত!) পরিবেশে ঘটে :)

হোস্ট শিরোনামটির পুনর্লিখনের মধ্যে যদি কোনও মজাদার প্রক্সি থাকে তবে এটি আর কাজ করবে না।

30 জুলাই 2013 আপডেট করুন

নীচের মন্তব্যে @ কেভিন জোনস দ্বারা উল্লিখিত হিসাবে - পরবর্তী অংশে আমি যে সেটিংটি উল্লেখ করেছি তা এখানে নথিভুক্ত করা হয়েছে: http ://msdn.mic Microsoft.com/en-us/library/hh975440.aspx

যদিও আমাকে বলতে হবে যে আমি চেষ্টা করার পরে এটি কাজ করতে পারি না - তবে এটি আমার জন্য টাইপো বা কিছু তৈরি করতে পারে।

আপডেট 9 জুলাই 2012

আমি কিছুক্ষণ আগে এটি পেরিয়ে এসেছি এবং এই উত্তরটি আপডেট করার অর্থ ছিল, কিন্তু কখনই হয়নি। যখন এই উত্তরে সবেমাত্র একটি উত্সাহ এসেছে তখন আমি ভেবেছিলাম আমার এখনই এটি করা উচিত।

Asp.Net- এ আমি যে 'বাগ' উল্লেখ করেছি তাতে একটি আপাতদৃষ্টিতে অননুমোদিত অ্যাপসেটিং মান - যা বলা হয় - দিয়ে নিয়ন্ত্রণ করা যায় 'aspnet:UseHostHeaderForRequest'ie

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

HttpRequest.Urlআইএলএসপি- --->তে দেখার সময় আমি এটি পেরিয়ে এসেছি - নীচের অনুলিপিটির / বরাবর সেই আইএলএসপি ভিউ থেকে আটকানো নির্দেশিত:

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'


ঠিক আছে, তবে আপনি কোথায় বা কীভাবে এইচটিটিপিআরকুয়েস্টবেসের ম্যান উদাহরণ পেয়ে যাচ্ছেন যদি আপনি উদাহরণস্বরূপ কোনও কন্ট্রোলারে সরাসরি কোডের সাথে কাজ না করে থাকেন তবে বলতে দেয়?
PositiveGuy

@ কফিএডিক্টিক ওয়েল, এমভিসি 3-তে আপনার এইচটিপিপি কনটেক্সট রয়েছে urrent বর্তমান .আপনিবাদ, যেহেতু Asp.net 4 বেস বিমূর্ত ব্যবহার করে। নেট .৩.৫ বা তার চেয়ে কম থাকলে আপনি একই সম্পত্তি জুড়ে এইচটিপিআরকিউইটওয়্যার্পার ব্যবহার করতে পারেন, সিস্টেম.ওয়েব.আরস্ট্রাকশনগুলি থেকে
আন্দ্রেস

3
এটির জন্য খুব দেরী হয়েছে তবে ইউজহোস্টহাইডারফোর্ডউইকুয়েস্টআরএল এখানে নথিভুক্ত করা হয়েছে msdn.microsoft.com/en-us/library/hh975440.aspx
কেভিন জোন্স

ভাল জায়গা! অন্তত তারা 4.5 ডকুমেন্টেশনের জন্য এটি যুক্ত করেছে!
আন্দ্রেস জোল্টান


12
Request.Url.PathAndQuery

নিখুঁতভাবে কাজ করা উচিত, বিশেষত যদি আপনি কেবল আপেক্ষিক উরি চান (তবে ক্যোরিস্ট্রিংগুলি রাখছেন)


8

আমিও এটি ফেসবুকের কারণে অনুসন্ধান করেছিলাম এবং এখন পর্যন্ত প্রদত্ত যে কোনও উত্তর প্রয়োজন হিসাবে কাজ করেছে বা খুব জটিল নয় are

@Request.Url.GetLeftPart(UriPartial.Path)

সম্পূর্ণ প্রোটোকল, হোস্ট এবং ক্যোরিস্ট্রিং "ছাড়াই" পায় G আপনি ডিফল্ট ৮০ ছাড়া অন্য কিছু ব্যবহার করে থাকলে পোর্টটিও অন্তর্ভুক্ত করে।


দুর্দান্ত খুঁজে! আমার সন্দেহ হয় জিজ্ঞাসার সময় এটার অস্তিত্ব ছিল না? আমার মনে হচ্ছে আমি এটি দেখেছি :)
শেভ

আমি ভেবেছিলাম যেখানে এটি সবেমাত্র যুক্ত হয়েছে তবে আমি কেবল যাচাই করেছিলাম এবং মনে হয় এটি নেট .1 1.1 থেকে রয়েছে। কে জানে.
johnw182

4

আমার পছন্দ...

Url.Content(Request.Url.PathAndQuery)

বা শুধু...

Url.Action()

Url.Action () কেবলমাত্র url এর ডান দিক সরবরাহ করে, যদি আপনার পুরো পূর্ণ ইউআরএল প্রয়োজন হয়?
অলোক

1

একটি জিনিস যা অন্যান্য উত্তরে উল্লিখিত হয়নি তা হ'ল কেস সংবেদনশীলতা, যদি এটি একাধিক জায়গায় উল্লেখ করা হয় (যা এটি মূল প্রশ্নে নয় তবে বিবেচনার জন্য মূল্যবান কারণ এই প্রশ্নটি অনেকগুলি অনুরূপ অনুসন্ধানে প্রদর্শিত হয়) )। অন্যান্য উত্তরের উপর ভিত্তি করে আমি নিম্নলিখিতটি আমার জন্য প্রাথমিকভাবে কাজ করতে দেখেছি:

Request.Url.AbsoluteUri.ToString()

তবে আরও নির্ভরযোগ্য হওয়ার জন্য এটি তখন পরিণত হয়েছিল:

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

এবং তারপরে আমার প্রয়োজনীয়তার জন্য (কোন ডোমেন নাম থেকে সাইটটি অ্যাক্সেস করা হচ্ছে এবং প্রাসঙ্গিক সামগ্রীটি দেখানো হচ্ছে):

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


এটি এটিকে "আরও নির্ভরযোগ্য" করে তোলে না। এটি হ্রাস করা কার্যকর কিনা পুরোপুরি নির্ভর করে আপনি আসলে যা করার চেষ্টা করছেন তার উপর এবং কেস-সংবেদনশীলতা কেন সেখানে বোঝায়। সাধারণত আপনি না URL টি কেস সংবেদনশীল হতে চাই।
কোডকাস্টার 25'16

1
@ কোডকাস্টার হ্যাঁ, 'বেশি নির্ভরযোগ্য' শব্দটি আমার নিজের অভিজ্ঞতার ভিত্তিতে তৈরি হয়েছিল, কারণ আমি অবশ্যই চাই না যে ইউআরএলগুলি ক্ষেত্রে সংবেদনশীল হোক কারণ এটি ক্লায়েন্টদের কোনও সমস্যার শেষ না করে causes
লায়ল

0

আমার পক্ষে সমস্যাটি তখন ছিল যখন আমি HTTPContextকন্ট্রোলারের কনস্ট্রাক্টরে অ্যাক্সেস করার চেষ্টা করি যখন HTTPContextএখনও প্রস্তুত নেই। সূচক পদ্ধতির অভ্যন্তরে সরানোর সময় এটি কাজ করে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.