感谢您将我带到 uri 构建器。我想出了这个解决方案,它适用于本地(使用端口号)和远程。
Private Function pathCombine(ByVal p1 As String, ByVal p2 As String) As String
Return String.Format("{0}/{1}", p1.TrimEnd.TrimEnd(CChar("/")), p2.TrimStart(CChar("/")))
End Function
Private Function getURI(ByVal https As Boolean, ByVal appendPath As String) As UriBuilder
Dim uri As New UriBuilder
' set scheme / protocol
uri.Scheme = CStr(IIf(https, "https", "http"))
' set port
Dim port As String = System.Web.HttpContext.Current.Request.ServerVariables("SERVER_PORT")
Select Case port
Case Nothing, "80", "443"
uri.Port = -1
Case Else
uri.Port = CInt(port)
End Select
' set server / host
uri.Host = HttpUtility.UrlEncode(HttpContext.Current.Request.ServerVariables("SERVER_NAME"))
' set the path
uri.Path = pathCombine(System.Web.HttpContext.Current.Request.ApplicationPath, appendPath)
Return uri
End Function
两个使用示例:
Context.Response.Redirect(getURI(True, "secure/Default.aspx").ToString, True)
Dim uri As New UriBuilder(getURI(True, "secure/Default.aspx").ToString)
uri.Query("foo=bar")
Context.Response.Redirect(uri.ToString, True)