Request.Url.Host وApplicationPath في مكالمة واحدة
-
22-08-2019 - |
سؤال
هل هناك أي طريقة للحصول على HttpContext.Current.Request.Url.Host
و HttpContext.Current.Request.ApplicationPath
في مكالمة واحدة؟
شيء مثل "عنوان url للتطبيق الكامل"؟
يحرر:توضيح - ما أحتاجه هو هذا الجزء الموجود داخل []:
http://[www.mysite.com/mywebapp]/Pages/Default.aspx
أنا أسأل ببساطة من باب الفضول.
تحرير 2:شكرا لجميع الردود، ولكن لم يكن أي منها بالضبط ما كنت أبحث عنه.لمعلوماتك، لقد قمت بحل المشكلة بهذه الطريقة (لكنني مازلت مهتمًا بمعرفة ما إذا كانت هناك طريقة أكثر سلاسة):
public string GetWebAppRoot()
{
if(HttpContext.Current.Request.ApplicationPath == "/")
return "http://" + HttpContext.Current.Request.Url.Host;
else
return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
}
المحلول
public static string GetSiteRoot()
{
string port = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
if (port == null || port == "80" || port == "443")
port = "";
else
port = ":" + port;
string protocol = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"];
if (protocol == null || protocol == "0")
protocol = "http://";
else
protocol = "https://";
string sOut = protocol + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + port + System.Web.HttpContext.Current.Request.ApplicationPath;
if (sOut.EndsWith("/"))
{
sOut = sOut.Substring(0, sOut.Length - 1);
}
return sOut;
}
نصائح أخرى
وهذا لم يكن يعمل على المضيف المحلي بلدي مع رقم المنفذ لذلك جعل تعديلات طفيفة:
private string GetWebAppRoot()
{
string host = (HttpContext.Current.Request.Url.IsDefaultPort) ?
HttpContext.Current.Request.Url.Host :
HttpContext.Current.Request.Url.Authority;
host = String.Format("{0}://{1}", HttpContext.Current.Request.Url.Scheme, host);
if (HttpContext.Current.Request.ApplicationPath == "/")
return host;
else
return host + HttpContext.Current.Request.ApplicationPath;
}
ما يجب عليك فعله حقا هو:
return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host);
وبهذه الطريقة يعمل إذا كنت تستخدم HTTPS (أو بعض مخطط آخر!)
وشكرا لجميع الردود، ولكن أيا منها كان بالضبط ما كنت أبحث عنه. لمعلوماتك، أنا حل المشكلة بهذه الطريقة (ولكن ما زلت مهتما في معرفة ما إذا كانت هناك طريقة أكثر سلاسة):
public string GetWebAppRoot()
{
if(HttpContext.Current.Request.ApplicationPath == "/")
return "http://" + HttpContext.Current.Request.Url.Host;
else
return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
}
يفحص هذا المشنور:
public static Uri GetBaseUrl(HttpRequest request)
{
Uri contextUri = new Uri(request.Url, request.RawUrl);
UriBuilder realmUri = new UriBuilder(contextUri) { Path = request.ApplicationPath, Query = null, Fragment = null };
return realmUri.Uri;
}
public static string GetAbsoluteUrl(HttpRequest request, string relativeUrl)
{
return new Uri(GetBaseUrl(request), VirtualPathUtility.ToAbsolute(relativeUrl)).AbsoluteUri;
}
إذا لم تحصل على ما تحتاجه من GetBaseUrl مباشرة، فمن الممكن القيام بما يلي:
GetAbsoluteUrl(HttpContext.Current.Request, "/")
HttpContext.Current.Request.Url.AbsoluteUri