ما هي أفضل طريقة في ASP.NET للحصول على المجال الحالي؟
-
09-06-2019 - |
سؤال
أتساءل ما هي أفضل طريقة للحصول على المجال الحالي في 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