سؤال

هل هناك أي طريقة للحصول على 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top