2009-11-30 19 views
10

में गतिशील सबडोमेन मैं एएसपीनेट के लिए बिल्कुल नया हूं, और आईआईएस के साथ थोड़ा सा अनुभव है। मैं अपने आवेदन के प्रत्येक उपयोगकर्ता को अपना उप-डोमेन प्राप्त करना चाहता हूं, लेकिन सभी एक ही नियंत्रक का उपयोग करते हैं। उपडोमेन तब नियंत्रित करेगा कि कौन सी सामग्री प्रदर्शित की जाती है।एएसपीनेट एमवीसी

उदाहरण:

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

दोनों एक ही नियंत्रक का उपयोग करेंगे। आदर्श रूप से एक पैरामीटर उपयोगकर्ता नाम नियंत्रक को दे सकता है, जो उचित सामग्री प्रदर्शित कर सकता है। मैं यह लचीला होना चाहता हूं कि हर बार जब कोई नया सबडोमेन जोड़ा जाता है तो रूटिंग नियमों को दोबारा लिखने के बिना डेटाबेस में नए सबडोमेन को जोड़ा जा सकता है।

+0

मैं वास्तव में केवल अब तक निर्मित दृश्य स्टूडियो सर्वर का उपयोग कर रहा हूं, इसलिए डोमेन लोकलहोस्ट है। मुझे अभी तक कोई सबडोमेन नहीं मिला है। Localhost/जो कुछ भी मुझे एक वैध नियंत्रक के पास ले जाना है। – captncraig

+0

आप स्थानीय प्रबंधन के साथ नहीं करेंगे - डोमेन प्रबंधन पहलुओं का परीक्षण करने के लिए आपको आईआईएस चलाने के लिए होगा। – Murph

उत्तर

9

एमवीसी डोमेन के लिए बाध्य नहीं है, बस पथ पर (उदा। http://domain/path)।

अपने सर्वर की ओर इशारा करते .yourdomain.com के लिए ऐसा करने के लिए ठीक से आप निम्नलिखित की आवश्यकता है ...

  1. वाइल्डकार्ड DNS सेटअप *।
  2. के साथ आईआईएस सेटअप में साइट कोई होस्ट शीर्षलेख नहीं है। पर आईआईएस के उस उदाहरण में होस्ट किए गए एक ही आईपी में होस्ट हेडर निर्दिष्ट होना चाहिए।
  3. आपके आवेदन को पृष्ठ लोड, सत्र प्रारंभ या कुछ अन्य ईवेंट पर अनुरोध होस्ट शीर्षलेख की जांच करने की आवश्यकता होगी।
1

अधिकतर कोई समस्या नहीं है। मुझे लगता है!

आवेदन/राउटिंग के मामले में रूटिंग शुरू होता है जहां डोमेन समाप्त होता है, इसलिए एक ही एप्लिकेशन में एकाधिक डोमेन मैपिंग करना कोई समस्या नहीं है, जो केवल काम करेगा।

आईआईएस के संदर्भ के रूप में आप चाहते हैं आप के रूप में कई डोमेन मैप कर सकते हैं में एक भी साइट के लिए (अच्छी तरह से वहाँ एक सीमा होने के लिए बाध्य कर रहा है) - आप उपयोग कर आईआईएस का कौन सा संस्करण हैं - मुझे यकीन है कि अगर आप एक वाइल्डकार्ड का उपयोग कर सकते हैं नहीं कर रहा हूँ ?

जब कोई अनुरोध आता है तो ऐसी घटनाएं होती हैं जहां आप डोमेन को देखने के लिए हुक कर सकते हैं और इसलिए आप चाहते हैं कि पैरामीटर सेट करें (उदाहरण के लिए उपयोगकर्ता), अनुरोध के लिए रूट यूआरएल बाद में भी चक्र में संदर्भ से उपलब्ध है - लेकिन आप इसे जल्दी से चुनना चाहेंगे।

यदि आप वाइल्डकार्ड कर सकते हैं तो यह काफी छोटा हो जाता है - अनुरोध उठाएं, डेटाबेस में उपयोगकर्ताओं के खिलाफ सबडोमेन को मान्य करें (यदि डिफ़ॉल्ट साइट पर मान्य रीडायरेक्ट नहीं है), उपयोगकर्ता को सेट करें और सामान्य रूटिंग के माध्यम से आगे बढ़ें।

यदि आप वाइल्डकार्ड नहीं कर सकते हैं तो चुनौती आपके एप्लिकेशन से फ्लाई पर आईआईएस एप्लिकेशन (वेबसाइट) में होस्ट हेडर जोड़ रही है क्योंकि उपयोगकर्ताओं को डेटाबेस में जोड़ा जाता है।

+2

आईआईएस के साथ यदि किसी होस्ट हेडर वैल्यू को किसी साइट के लिए निर्दिष्ट नहीं किया गया है तो यह सभी होस्ट हेडर मान स्वीकार करता है, आपको बस यह सुनिश्चित करना होगा कि आपके पास आईआईएस में केवल 1 साइट प्रति आईपी सेटअप है। – MyItchyChin

3

मुझे इस व्यक्ति के ब्लॉग पर एक आसान जवाब मिला। यह काम करता है और साथ ही यह करता है और यह समाधान 4 साल से अधिक पुराना है।

http://blog.maartenballiauw.be/post/2009/05/20/aspnet-mvc-domain-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 
));