Antwort

11

Bereiche sind nicht direkt mit dem Routing verbunden, daher lautet Ihre Frage "unterstützt Routing Subdomains?"

Die Antwort darauf ist leider, dass es keine integrierte Unterstützung dafür gibt.

aber die gute Nachricht ist, dass viele Menschen versucht haben und gefunden Erfolg mit kundenspezifischen Code, der auf der Routing-Builds:

Wenn Sie herausfinden, wie Sie Subdomains ohne Bereiche routen, sollte es nicht schwieriger sein, mit Bereichen zu arbeiten. Gehen Sie zu Ihrem Gebietsregistrierungskontext und verwenden Sie die von Ihnen gewählte Technik. Bereiche sind nur eine Möglichkeit, Controller und Ansichten zu gruppieren - sie haben für ASP.NET MVC selbst keine große Bedeutung (sie tun ein wenig, aber nicht viel).

+1

+1 für eher klärende Antwort. –

5

Mit dem IIS7 URL Rewrite-Modul können Sie Domains oder Subdomains problemlos einem MVC2-Bereich zuordnen. Hier sind zwei einfache Regeln, die Subdomains auf zwei Bereiche abbilden. Ich habe eine Einschränkung hinzugefügt, um diese Regel nicht zu verwenden, wenn die Anfrage nach einer tatsächlichen Datei (d. H. CSS-, JS- oder Bilddateien) erfolgt.

Hier ist der Beispielconfig, die direkt in Ihrem web.config geht:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="SubA Area"> 
       <match url=".*" /> 
       <action type="Rewrite" url="/SubA/{R:0}" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="suba.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
      </rule> 
      <rule name="SubB Area"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="subb.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="/SubB/{R:0}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Hier finden Sie die Regeln ändern müssen unten mit Ihrem speziellen Anwendungsfall zu arbeiten. Vor allem, wenn Sie Controller im Root-Bereich haben, den Sie verwenden müssen. Fügen Sie in diesem Fall einfach eine Bedingung hinzu oder erstellen Sie eine neue Regel.

Laden Sie die IIS URL Rewrite-Modul (erforderlich): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

3

ich auf das gleiche Problem getroffen und ich habe eine Lösung aufgebaut, die für mich gearbeitet, es ist in meinem blog, hoffentlich wird es von Nutzen sein für dich.

Prost Tony

1

Ich habe eine Menge der auf anderen Threads erwähnt Lösungen ausprobiert und fand Dinge zu kompliziert sehr schnell bekommen. Es scheint so, als ob ASP.Net MVC möchte, dass Sie Route unterteilen, um diese Art von fortgeschrittenem Routing durchzuführen, aber es schien nie für mich zu funktionieren. Ich war nie in der Lage, eine Domain auf einen Namespace zu mappen, also endete ich mit "mehrdeutigen Controller" -Ausnahmen (da ich in beiden Namespaces einen Home-Controller hatte).

Letztendlich habe ich eine Einschränkung verwendet, um Subdomänen auf Namespaces zu verweisen.

So sieht meine Route aus. Beachten Sie, dass diese Route für die "api" ist. Sub-Domain:

 context.MapRoute(
      "Api_Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { controller = new SubdomainRouteConstraint("api.") }, 
      new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" } 
      ); 

Hier ist die "SubdomainRouteConstraint" Klasse oben verwiesen:

public class SubdomainRouteConstraint : IRouteConstraint 
{ 
    private readonly string SubdomainWithDot; 

    public SubdomainRouteConstraint(string subdomainWithDot) 
    { 
     SubdomainWithDot = subdomainWithDot; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri); 
    } 
} 

Es ist natürlich ein ganz Hack, aber ich bin wirklich glücklich mit, wie einfach es endete.

Sie könnten diesen Code einfach zwicken, um eine Subdomain dynamisch einem Bereich zuzuordnen, aber ich habe nur zwei Bereiche, also registriere ich jeden Bereich separat. Außerdem gibt mir das die Freiheit, in jedem Bereich unterschiedliche Routen zu haben.

+0

funktioniert mir leider nicht. Ich habe 2 Home-Controller - einer davon ist in Subdomain. Er löst sich wie andere Lösungen aus. Es wurden mehrere Typen gefunden, die mit dem Controller namens "Home" übereinstimmen. Wenn ich es in eindeutigen Namen umbenenne, funktioniert es gut. Aber wie ist es unklar, wie Sie Links zu der Subdomain generieren? Ich habe versucht @ Html.RouteLink ("Mobile", "api_default"), aber es ist Link zur Hauptseite der Anwendung generiert ... – Cheburek