在產生郵件連結、站點地圖、Open Graph 標籤等情境下,需取得網站完整根網址(含 Scheme、Host、Port、應用程式路徑)。本文提供一個可重用的靜態屬性實作。
public static class WebUtility
{
/// <summary>
/// 取得網站根目錄的絕對 Uri(例如 https://www.example.com/MyApp/)
/// </summary>
public static Uri AbsoluteWebRoot
{
get
{
var context = HttpContext.Current;
if (context == null || context.Request == null)
throw new InvalidOperationException("HttpContext.Current 不可用,請在 Web 請求上下文中呼叫。");
var uriBuilder = new UriBuilder
{
Scheme = context.Request.Url.Scheme,
Host = context.Request.Url.Host,
Port = context.Request.Url.IsDefaultPort ? -1 : context.Request.Url.Port,
Path = VirtualPathUtility.ToAbsolute("~/")
};
return uriBuilder.Uri;
}
}
}
// 產生完整驗證連結
string verifyUrl = WebUtility.AbsoluteWebRoot + "Account/VerifyEmail?token=" + token;
// 結果:https://www.mysite.com/MyApp/Account/VerifyEmail?token=abc123
// 郵件範本中
string body = $@"請點擊以下連結驗證信箱:<a href='{verifyUrl}'>驗證</a>";
VirtualPathUtility.ToAbsolute("~/") 正確解析應用程式虛擬路徑(含尾端 /),無論網站部署於根目錄或虛擬目錄皆正確。UriBuilder 自動處理預設埠號(80/443)不顯示於 URL。Scheme 自動偵測 http/https,支援負載平衡器卸載 SSL 的情境(需配合 Request.Headers["X-Forwarded-Proto"] 或 `ForwardedHeadersMiddleware`)。public static class WebUtility
{
public static string GetBaseUrl(this HttpRequest request)
{
return $"{request.Scheme}://{request.Host}{request.PathBase}/";
}
}
// 使用
var baseUrl = HttpContext.Request.GetBaseUrl();
og:urlsitemap.xml 產生