2008-09-23 14 views
6

Come posso ottenere in modo coerente l'URL assoluto o root completo del sito indipendentemente dal fatto che il sito si trovi in ​​una directory virtuale e indipendentemente da dove si trova il mio codice nella struttura delle directory? Ho provato ogni variabile e funzione a cui riesco a pensare e non ho trovato un buon modo.Determina l'url assoluto e completo del sito in asp.net

Voglio essere in grado di ottenere l'url del sito attuale, vale a dire http://www.example.com o se si tratta di una directory virtuale, http://www.example.com/DNN/


Ecco alcune delle cose che ho provato e il risultato. L'unico che include tutto il pezzo che voglio (http://localhost:4471/DNN441) è Request.URI.AbsoluteURI:

  • Request.PhysicalPath: C: \ WebSites \ DNN441 \ Default.aspx
  • Request.ApplicationPath:/DNN441
  • Request.PhysicalApplicationPath: C: \ WebSites \ DNN441 \
  • MapPath: C: \ WebSites \ DNN441 \ DesktopModules \ articoli \ Modelli \ Default.aspx
  • RawURL: /DNN441/ModuleTesting/articoli/tabid/56/CTL/Dettagli/mid/374/ItemID/1/D efault.aspx
  • Request.Url.AbsoluteUri: http://localhost:4471/DNN441/Default.aspx
  • Request.Url.AbsolutePath: /DNN441/Default.aspx
  • Request.Url.LocalPath: /DNN441/Default.aspx Request.Url.Host: localhost
  • Request.Url.PathAndQuery: /DNN441/Default.aspx?TabId=56 & CTL = Dettagli & mid = 374 & ItemID = 1

risposta

12

Leggendo la risposta fornita nel blog di Rick Strahl, ho trovato che quello di cui avevo veramente bisogno era piuttosto semplice. In primo luogo è necessario determinare il percorso relativo (che per me era la parte facile), e passare che nella funzione definita di seguito:

VB.NET

Public Shared Function GetFullyQualifiedURL(ByVal s as string) As String 
    Dim Result as URI = New URI(HttpContext.Current.Request.Url, s) 
    Return Result.ToString 
End Function 

C#

public static string GetFullyQualifiedURL(string s) { 
    Uri Result = new Uri(HttpContext.Current.Request.Url, s); 
    return Result.ToString(); 
} 
+0

Cheers, ha funzionato perfettamente. – Echilon

+1

Penso che funzioni solo se la tua richiesta attuale è già alla radice. Altrimenti è relativo alla directory delle richieste correnti, non alla radice del percorso dell'applicazione del server. Ho avuto successo con: Request.Url.GetLeftPart (UriPartial.Authority) + Request.ApplicationPath –

5

V'è una certa discussione eccellente e idee su Rick Strahl's blog

EDIT: Vorrei aggiungere che le idee funzionano con o senza un HttpContext valido.

EDIT2: Ecco il specific comment/code su quel post che risponde alla domanda

+0

L'ultimo post sulla pagina sembra essere la risposta di cui ho bisogno. Non ho "accettato" questa risposta, anche se odio che le persone debbano leggere tutto ciò che esiste per arrivare alla risposta finale ... Non sono sicuro se dovrei semplicemente ripubblicare l'ultimo post qui o quale sia la migliore risoluzione . – EfficionDave

0

Hai provato AppSettings.RootUrl che di solito è configurato nel file web.config?

+0

Questo sarà per un modulo DotNetNuke e la maggior parte dei siti DotNetNuke non ha questa impostazione. – EfficionDave

0

Stai parlando per l'uso come link?

in tal caso, quindi fare questo <a href='/'>goes to root</a> ti porterà al file predefinito della web root.

Ora, per il client, fare, passando "~ /" al metodo Control :: ResolveUrl ti fornirà quello che stai cercando. (http://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveurl.aspx)

+0

No, questi sarebbero entrambi collegamenti relativi. Ho bisogno della radice assoluta, completamente qualificata. Ho una varietà di casi in cui ho bisogno di questo, quello specifico ora è così posso passare il ritorno e cancellare gli url su Paypal. – EfficionDave

0

Non ho modo di convalidarlo al momento ma hai provato "Request.Url.AbsoluteUri" da un'altra macchina?

Mi sembra che, per quanto riguarda la macchina, il browser stia richiedendo da localhost.

Potrei sbagliarmi, ma penso che la richiesta sia relativa al browser e non al webserver.

2

Trovato this code here:

string appPath = null; 

appPath = string.Format("{0}://{1}{2}{3}", 
    Request.Url.Scheme, 
    Request.Url.Host, 
    Request.Url.Port == 80 ? string.Empty : ":" + Request.Url.Port, 
    Request.ApplicationPath); 
7

La risposta accettata presuppone che la richiesta corrente sia già al server/root virtuale. Prova questo:

Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath 
+0

A volte trovo che questa sia l'opzione preferita. Non abbastanza per cambiarlo ancora nella risposta accettata, ma forse in tempo. – EfficionDave