Korzystam z wtyczki komentarzy na Facebooku na blogu, który tworzę. Zawiera niektóre tagi FBXML, które są interpretowane przez javascript na Facebooku, do którego odwołuje się strona.
To wszystko działa dobrze, ale muszę przekazać bieżący, w pełni kwalifikowany adres URL do wtyczki.
<div style="width: 900px; margin: auto;">
<div id="fb-root"></div>
<fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>
Jaki jest najlepszy sposób na uzyskanie adresu URL bieżącej strony? URL żądania
Rozwiązanie
Oto końcowy kod mojego rozwiązania:
<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>
c#
asp.net
asp.net-mvc
razor
Chev
źródło
źródło
Request.Url.ToString()
a możeRequest.Url.AbsoluteUri
?Request.Url.AbsoluteUri
zrobiłem to :)Dodaj tę metodę rozszerzenia do swojego kodu:
A następnie możesz wykonać to poza
RequestContext.HttpContext.Request
właściwością.W Asp.Net występuje błąd (można go usunąć krokiem, patrz poniżej), który pojawia się na komputerach, które używają portów innych niż port 80 dla lokalnej strony internetowej (duży problem, jeśli wewnętrzne strony internetowe są publikowane poprzez równoważenie obciążenia na wirtualnym IP a porty są używane wewnętrznie do reguł publikowania), dzięki czemu Asp.Net zawsze doda port do
AbsoluteUri
właściwości - nawet jeśli pierwotne żądanie go nie używa.Ten kod zapewnia, że zwrócony adres URL jest zawsze równy adresowi URL, którego pierwotnie zażądała przeglądarka (w tym port - tak jak byłby zawarty w nagłówku hosta), zanim nastąpi równoważenie obciążenia itp.
Przynajmniej działa w naszym (raczej skomplikowanym!) Środowisku :)
Jeśli między funkcjami przepisują nagłówek hosta jakieś funky proxy, to też nie zadziała.
Zaktualizuj 30 lipca 2013 r
Jak wspomniano w @KevinJones w komentarzach poniżej - ustawienie, o którym wspomniałem w następnej sekcji, zostało udokumentowane tutaj: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Chociaż muszę powiedzieć, że nie mogłem go uruchomić, gdy go wypróbowałem - ale to może być po prostu literówka lub coś takiego.
Zaktualizuj 9 lipca 2012 r
Spotkałem się z tym jakiś czas temu i zamierzałem zaktualizować tę odpowiedź, ale nigdy tego nie zrobiłem. Kiedy właśnie pojawiła się opinia na temat tej odpowiedzi, pomyślałem, że powinienem to zrobić teraz.
„Błąd”, o którym wspomniałem w Asp.Net, można kontrolować za pomocą pozornie nieudokumentowanej wartości appSettings - nazywanej
'aspnet:UseHostHeaderForRequest'
- tj .:Natknąłem się na to, patrząc na
HttpRequest.Url
ILSpy - wskazane przez--->
po lewej stronie następującej kopii / wklej z tego widoku ILSpy:Ja osobiście nie korzystałem z niego - jest to nieudokumentowane i dlatego nie ma gwarancji, że będę się trzymał - jednak może zrobić to samo, o czym wspomniałem powyżej. W celu zwiększenia trafności w wynikach wyszukiwania - i potwierdzić ktoś, kto seeems odkryli ten - ustawienie zostało również wymienione przez Nick Aceves na Twitterze
'aspnet:UseHostHeaderForRequest'
źródło
źródło
powinien działać idealnie, zwłaszcza jeśli chcesz tylko względnego Uri (ale zachowując kwerendy)
źródło
Ja również szukałem tego z powodów na Facebooku i żadna z udzielonych odpowiedzi nie działała w razie potrzeby ani nie była zbyt skomplikowana.
Pobiera pełny protokół, host i ścieżkę „bez” kwerendy. Obejmuje również port, jeśli używasz czegoś innego niż domyślny 80.
źródło
Mój ulubiony...
Lub tylko...
źródło
Jedną rzeczą, która nie jest wymieniona w innych odpowiedziach, jest rozróżnianie wielkości liter, jeśli ma się odwoływać w wielu miejscach (czego nie ma w pierwotnym pytaniu, ale warto je wziąć pod uwagę, ponieważ to pytanie pojawia się w wielu podobnych wyszukiwaniach ). W oparciu o inne odpowiedzi, początkowo stwierdziłem, że dla mnie zadziałały:
Request.Url.AbsoluteUri.ToString()
Ale aby być bardziej niezawodnym, stało się to wtedy:
Request.Url.AbsoluteUri.ToString().ToLower()
A następnie według moich wymagań (sprawdzenie, z jakiej nazwy domeny uzyskuje się dostęp do witryny i wyświetlenie odpowiedniej treści):
Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")
źródło
Dla mnie problem polegał na tym, że próbowałem uzyskać dostęp
HTTPContext
do konstruktora kontrolera, gdyHTTPContext
nie jest on jeszcze gotowy. Po przeniesieniu do metody indeksu działało:źródło
Przypadek (styl pojedynczej strony) dla historii przeglądarki
źródło