سؤال

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

مثال:

user1subdomain.mydomain.com/Whatever
user2subdomain.mydomain.com/Whatever

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

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

المحلول

MVC غير مرتبط بالمجال، فقط بالمسار (على سبيل المثال. http://domain/path).

للقيام بذلك بشكل صحيح تحتاج إلى ما يلي ...

  1. إعداد DNS حرف البدل ل *.yourdomain.com مشيرا إلى الخادم الخاص بك.
  2. الموقع في إعداد IIS مع لا يوجد رأس مضيف.أي مواقع أخرى مستضاف في هذا المثيل من IIS على يجب أن يحتوي عنوان IP نفسه على رؤوس مضيف المحدد.
  3. سيحتاج طلبك إلى التحقق من طلب رأس المضيف إما عند تحميل الصفحة ، بدء الجلسة أو بعض الأحداث الأخرى.

نصائح أخرى

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

HTTP: //blog.maartenballiauw. يكون / آخر / 2009 / 20/05 / ASPNET-MVC-المجال routing.aspx

ووتنفيذ طريق مخصص:

public class DomainRoute : Route
{
    public string Domain { get; set; }


    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // Build regex
        domainRegex = CreateRegex(Domain);
        pathRegex = CreateRegex(Url);

        // Request information
        string requestDomain = httpContext.Request.Headers["host"];
        if (!string.IsNullOrEmpty(requestDomain))
        {
            if (requestDomain.IndexOf(":") > 0)
            {
                requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
            }
        }
        else
        {
            requestDomain = httpContext.Request.Url.Host;
        }
        string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;

        // Match domain and route
        Match domainMatch = domainRegex.Match(requestDomain);
        Match pathMatch = pathRegex.Match(requestPath);

        // Route data
        RouteData data = null;
        if (domainMatch.Success && pathMatch.Success)
        {
            data = new RouteData(this, RouteHandler);

            // Add defaults first
            if (Defaults != null)
            {
                foreach (KeyValuePair<string, object> item in Defaults)
                {
                    data.Values[item.Key] = item.Value;
                }
            }

            // Iterate matching domain groups
            for (int i = 1; i < domainMatch.Groups.Count; i++)
            {
                Group group = domainMatch.Groups[i];
                if (group.Success)
                {
                    string key = domainRegex.GroupNameFromNumber(i);
                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }

            // Iterate matching path groups
            for (int i = 1; i < pathMatch.Groups.Count; i++)
            {
                Group group = pathMatch.Groups[i];
                if (group.Success)
                {
                    string key = pathRegex.GroupNameFromNumber(i);
                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }
        }    
    return data;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
    }

    public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
    {
        // Build hostname
        string hostname = Domain;
        foreach (KeyValuePair<string, object> pair in values)
        {
            hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
        }

        // Return domain data
        return new DomainData
        {
            Protocol = "http",
            HostName = hostname,
            Fragment = ""
        };
    }}

وهنا هو كيف يمكن استخدامها.

routes.Add("DomainRoute", new DomainRoute(
"{controller}-{action}.example.com",     // Domain with parameters
"{id}",    // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
));

وفي الغالب ليست مشكلة. أعتقد!

وأما من حيث التطبيق / التوجيه يبدأ التوجيه حيث ينتهي المجال بحيث رسم مجالات متعددة لنفس التطبيق ليست مشكلة، التي ستعمل فقط.

في شروط IIS يمكنك تعيين العديد من المجالات على النحو الذي تريد (وأيضا هناك بد أن يكون الحد) إلى موقع واحد - لست متأكدا ما اذا كان يمكنك استخدام البدل - ما هو إصدار IIS الذي تستخدمه؟

عند وصول طلب هناك أحداث يمكنك ربط لإلقاء نظرة على نطاق وبالتالي إعداد المعلمات تريد (المستخدم على سبيل المثال)، وURL الجذر للطلب هو متاح من سياق في وقت لاحق في دورة جدا - ولكن عليك 'ليرة لبنانية تريد أن يستلم في وقت مبكر.

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

إذا كنت لا تستطيع أن تفعل البدل ثم التحدي هو إضافة رؤوس المضيف إلى تطبيق IIS (الانترنت) على الطاير من التطبيق الخاص بك كما يتم إضافة المستخدمين إلى قاعدة البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top