Determinar absoluta url do site, totalmente qualificado em asp.net
Pergunta
Como posso obter consistentemente o absoluto raiz ou base url, totalmente qualificado do site, independentemente do site é em um diretório virtual e, independentemente de onde o meu código é na estrutura de diretórios? Tentei todas as variáveis ??e das funções que eu posso pensar e não ter encontrado um bom caminho.
Eu quero ser capaz de obter a URL do site atual, ou seja, http://www.example.com ou se é um diretório virtual, http://www.example.com/DNN/
Aqui estão algumas das coisas que eu tentei e o resultado. O único que inclui toda a peça que eu quero ( http: // localhost: 4471 / DNN441 ) é Pedido .URI.AbsoluteURI:
- Request.PhysicalPath: C: \ WebSites \ DNN441 \ Default.aspx
- Request.ApplicationPath: / DNN441
- Request.PhysicalApplicationPath: C: \ WebSites \ DNN441 \
- MapPath: C: \ WebSites \ DNN441 \ DesktopModules \ Artigos \ Templates \ Default.aspx
- RawUrl: /DNN441/ModuleTesting/Articles/tabid/56/ctl/Details/mid/374/ItemID/1/Default.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=Details&mid=374&ItemID=1
Solução
Ao ler a resposta dada no blog de Rick Strahl eu encontrei o que eu realmente precisava era bastante simples. Primeiro você precisa para determinar o caminho relativo (que para mim foi a parte mais fácil), e passar isso para a função definida abaixo:
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();
}
Outras dicas
A resposta aceita assume que o pedido atual já está no servidor / root virtual. Tente isto:
Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath
Há alguma discussão excelente e ideias sobre de Rick Strahl do blog
EDIT:. Devo acrescentar que as idéias de trabalho com ou sem um válido HttpContext
EDIT2: Aqui está a comentário específico / code on esse post que responde à pergunta ??p>
Encontrado este código aqui :
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);
Você já tentou AppSettings.RootUrl que normalmente é configurado no arquivo web.config?
Você está falando para uso como links?
Se sim, então fazer isso <a href='/'>goes to root</a>
irá levá-lo para o arquivo padrão da raiz web.
Agora, para o lado do cliente, fazendo, passando "~ /" para o método de controle :: ResolveUrl irá fornecer-lhe o que você está procurando. ( http://msdn.microsoft.com /en-us/library/system.web.ui.control.resolveurl.aspx )
Eu não tenho nenhuma maneira de validar esta no momento, mas você já tentou "Request.Url.AbsoluteUri" de outra máquina?
Ocorre-me que, tanto quanto a sua máquina está em causa do navegador está solicitando a partir de localhost.
Eu posso estar errado embora, mas eu acho pedido é relativo ao navegador e não o servidor Web.