ما هي أفضل طريقة في ASP.NET للحصول على المجال الحالي؟

StackOverflow https://stackoverflow.com/questions/61817

سؤال

أتساءل ما هي أفضل طريقة للحصول على المجال الحالي في ASP.NET؟

على سبيل المثال:

http://www.domainname.com/subdir/ يجب أن تسفر http://www.domainname.com http://www.sub.domainname.com/subdir/ يجب أن تسفر http://sub.domainname.com

كدليل، يجب أن أكون قادرًا على إضافة عنوان url مثل "/Folder/Content/filename.html" (على سبيل المثال كما تم إنشاؤه بواسطة Url.RouteUrl() في ASP.NET MVC) مباشرة على عنوان URL ويجب أن يعمل.

هل كانت مفيدة؟

المحلول

نفس إجابة MattMitchell ولكن مع بعض التعديلات.يؤدي هذا إلى التحقق من المنفذ الافتراضي بدلاً من ذلك.

يحرر:تحديث بناء الجملة واستخدام Request.Url.Authority كما هو مقترح

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

نصائح أخرى

حسب هذا الرابط نقطة البداية الجيدة هي:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

ومع ذلك، إذا كان المجال http://www.domainname.com:500 هذا سوف يفشل.

شيء مثل ما يلي مغري لحل هذه المشكلة:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

ومع ذلك، سيعتمد المنفذ 80 و443 على التكوين.

على هذا النحو، يجب عليك استخدام IsDefaultPort كما في إجابة مقبولة أعلاه من كارلوس مونيوز.

Request.Url.GetLeftPart(UriPartial.Authority)

تم تضمين هذا المخطط.

تحذير! إلى كل من يستخدم الطلب الحالي.Url.Host.افهم أنك تعمل بناءً على الطلب الحالي وأن الطلب الحالي لن يكون دائمًا مع خادمك ويمكن أن يكون في بعض الأحيان مع خوادم أخرى.

لذا، إذا كنت تستخدم هذا في شيء مثل Application_BeginRequest() في Global.asax، فسيكون الأمر جيدًا بنسبة 99.9% من الوقت، ولكن بنسبة 0.1% قد تحصل على شيء آخر غير اسم مضيف الخادم الخاص بك.

وخير مثال على ذلك شيء اكتشفته منذ وقت ليس ببعيد.الخادم الخاص بي يميل إلى ضرب http://proxyjudge1.proxyfire.net/fastenv من وقت لآخر.يتعامل Application_BeginRequest()‎ مع هذا الطلب بكل سرور، لذا إذا اتصلت بـ Request.Url.Host أثناء تقديم هذا الطلب، فستعود إلى proxyjudge1.proxyfire.net.قد يفكر البعض منكم "لا duh" ولكن تجدر الإشارة إلى أنه كان من الصعب جدًا ملاحظة الخطأ لأنه حدث في 0.1٪ فقط من الوقت:ص

لقد أجبرني هذا الخطأ على إدراج مضيف النطاق الخاص بي كسلسلة في ملفات التكوين.

لماذا لا تستخدم

Request.Url.Authority

تقوم بإرجاع المجال بأكمله والمنفذ.

لا تزال بحاجة إلى معرفة http أو https

بسيط و قصير الطريقة (تدعم المخطط والمجال والمنفذ):

يستخدم Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com

طريق اخر:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);

ماذا عن:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];

باستخدام يوري بيلدر:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();

ماذا عن:

String domain = "http://" + Request.Url.Host
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top