it-swarm.asia

كيفية الحصول على عنوان URL للصفحة الحالية في MVC 3

أستخدم المكون الإضافي لتعليقات Facebook على مدونة أقوم بإنشائها. يحتوي على بعض علامات FBXML التي يتم تفسيرها من خلال javascript facebook المشار إليها في الصفحة.

كل هذا يعمل بشكل جيد ، لكن يجب أن أنقل عنوان 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>
338
Chev

يمكنك استخدام Request.RawUrl ، Request.Url.OriginalString ، Request.Url.ToString() أو Request.Url.AbsoluteUri.

506
Darin Dimitrov

أضف طريقة التمديد هذه إلى الكود:

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 لموقع الويب المحلي (مشكلة كبيرة في حالة نشر مواقع الويب الداخلية عبر موازنة التحميل على IP الظاهري والمنافذ تستخدم داخليًا لقواعد النشر) حيث يقوم Asp.Net دائمًا بإضافة المنفذ على خاصية AbsoluteUri - حتى لو لم يستخدمه الطلب الأصلي.

يضمن هذا الرمز أن عنوان url الذي تم إرجاعه يساوي دائمًا عنوان 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.Url في ILSpy - المشار إليها بواسطة ---> على يسار النسخة/اللصق التالية من عرض 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 */
       ...

أنا شخصياً لم أستخدمه - إنه غير موثق وبالتالي لا يضمن التمسك به - ومع ذلك فقد يفعل الشيء نفسه الذي ذكرته أعلاه. لزيادة ملاءمة نتائج البحث - ولتقدير شخص آخر يرى أنه اكتشف هذا - تم أيضًا ذكر إعداد 'aspnet:UseHostHeaderForRequest' من قِبل Nick Aceves على Twitter

47
Andras Zoltan
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
12
Brian Ogden
Request.Url.PathAndQuery

يجب أن تعمل بشكل مثالي ، خاصة إذا كنت تريد فقط Uri النسبي (مع الحفاظ على querystrings)

11
Lucius

أنا أيضًا كنت أبحث عن هذا لأسباب فيسبوك ولم تعمل أي من الإجابات المقدمة حتى الآن حسب الحاجة أو معقدة للغاية.

@Request.Url.GetLeftPart(UriPartial.Path)

الحصول على البروتوكول الكامل والمضيف والمسار "بدون" الاستعلام. يتضمن أيضًا المنفذ إذا كنت تستخدم شيئًا آخر غير 80 الافتراضي.

8
johnw182

أفضله...

Url.Content(Request.Url.PathAndQuery)

أو فقط...

Url.Action()
4
Carter Medlin

هناك شيء واحد لم يتم ذكره في الإجابات الأخرى وهو حساسية الحالة ، إذا كان سيتم الرجوع إليها في أماكن متعددة (وهو ليس في السؤال الأصلي ولكن يستحق أن يؤخذ في الاعتبار لأن هذا السؤال يظهر في الكثير من عمليات البحث المشابهة ). بناءً على إجابات أخرى ، وجدت أن ما يلي يعمل بشكل جيد في البداية:

Request.Url.AbsoluteUri.ToString()

ولكن لكي تكون أكثر موثوقية ، أصبح هذا بعد ذلك:

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

وبعد ذلك لمتطلباتي (التحقق من اسم المجال الذي يتم الوصول إليه من الموقع وعرض المحتوى ذي الصلة):

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

0
Lyall

بالنسبة لي كانت المشكلة عندما حاولت الوصول إلى HTTPContext في مُنشئ Controller بينما HTTPContext غير جاهز بعد. عند نقلها داخل طريقة الفهرس ، عملت:

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