2016-05-10 44 views
0

Ich teste eine ASP MVC EF Anwendung .. mit IIS Express vor Ort. Ich versuche, die Subdomain in der HTTP-Anfrage zu ermitteln, aber ich erhalte eine "Bad Request - Ungültiger Hostname" FehlerASP MVC Subdomains auf Localhost

Ich habe einige der Antworten zum Ändern der Host-Datei angeschaut, aber das hat den Fehler nicht behoben.

In meinem Homecontroller ich diese Methode haben einfach den anfordernden URL

public string Index() {var hn = Request.Headers [ "HOST"] drucken; Rückgabe hn.ToString(); }

wenn localhost sehen -> die Seite geladen

bei der Anzeige von tenant1.localhost -> Bad Request

Wäre dankbar, wenn mir jemand in die richtige Richtung, diesen Fehler zu beheben zeigen kann.

Danke!

+0

Ungültige Hostname ist ein „dns“ Problem - das ist, warum Sie Einträge in Ihrer 'hosts' Datei für jede/alle„lokalen“erstellen müssen„Sub-Domain“Sie wollen lösen. Es wird angenommen, dass Sie einen Eintrag für 'tenant1.localhost' in Ihrer 'hosts'-Datei haben, damit dies funktioniert (vorausgesetzt, dass IIS ordnungsgemäß eingerichtet wird, sobald Sie' host'-Datei fertig gestellt haben - wahrscheinlich über Host-Header-Setup).Sie müssen dies im IIS-Manager tun. – EdSF

+0

hey, ja ich dies tat: 127.0.0.1 localhost \t 127.0.0.1 tenant1.localhost – user5120455

Antwort

0

standardmäßig IIS Express können nur localhost. Um es einer anderen Domain zu ermöglichen, Ihre Website in Entwicklung zu treffen, müssen Sie manuell eine Bindung in %USERPROFILE%\Documents\IISExpress\config\applicationhost.config hinzufügen. Suchen Sie den Knoten <site>, der Ihrer Anwendung entspricht, und fügen Sie im Knoten <bindings> einen neuen <binding> hinzu. Dort wird die Standardbindung als Anleitung verwendet. Verwechseln Sie jedoch nicht die Standardbindung, sonst können in Visual Studio seltsame Fehler auftreten.

Zusätzlich würde ich mit so etwas wie localtest.me empfehlen Subdomains zu testen, wie das subdomain.localhost Konstrukt nicht gut zu funktionieren neigt, da die meisten Dinge werden versuchen, anzunehmen, dass localhost die TLD ist. Im Grunde genommen ist localtest.me eine Domäne, die als Wildcard eingerichtet wurde, um alles an 127.0.0.1 (localhost) zu routen. So können Sie die gewünschte Subdomain auswählen und verwenden. Für das, was es wert ist, ist dies auch sehr effektiv für das Testen von Integrationen von Drittanbietern wie Facebook in der Entwicklung, da sie localhost nicht zulassen.

+0

Hallo Chris, ich habe nichts in meinem applicationhost.config unter Website zu finden. meinst du das, das in meinem .vs-Ordner ist. Vielleicht speichern neue Konventionen die Einstellungen im .vs-Ordner. Ich lese es eine andere Antwort. – Adrian

0

Ich versuchte Paul Taylor Antwort oben ist ziemlich gut, aber das nicht für mich ganz funktionierte. Ich verwende diese Implementierung von Route Klasse.

Fügen Sie Ihre benutzerdefinierten Domain in C:/Windows/System32/drivers/etc/hosts Datei

  • 127.0.0.1 subdomain.localhost.com

DomainData.cs

public class DomainData 
{ 
    public string Protocol { get; set; } 
    public string HostName { get; set; } 
    public string Fragment { get; set; } 
} 

DomainRoute.cs

public class DomainRoute : Route 
{ 
    private Regex domainRegex; 
    private Regex pathRegex; 

    public string Domain { get; set; } 

    public DomainRoute(string domain, string url, RouteValueDictionary defaults) 
    : base(url, defaults, new MvcRouteHandler()) 
{ 
    Domain = domain; 
} 

public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler) 
    : base(url, defaults, routeHandler) 
{ 
    Domain = domain; 
} 

public DomainRoute(string domain, string url, object defaults) 
    : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler()) 
{ 
    Domain = domain; 
} 

public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler) 
    : base(url, new RouteValueDictionary(defaults), routeHandler) 
{ 
    Domain = domain; 
} 

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 && requestDomain.ToLower() != "tg.local" && 
     requestDomain.ToLower() != "tg.terrasynq.net" && requestDomain.ToLower() != "www.townsgossip.com" && 
     requestDomain.ToLower() != "townsgossip.com") 
    { 
     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 = "" 
    }; 
} 

private Regex CreateRegex(string source) 
{ 
    // Perform replacements 
    source = source.Replace("/", @"\/?"); 
    source = source.Replace(".", @"\.?"); 
    source = source.Replace("-", @"\-?"); 
    source = source.Replace("{", @"(?<"); 
    source = source.Replace("}", @">([a-zA-Z0-9_\-]*))"); 

    return new Regex("^" + source + "$"); 
} 

private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values) 
{ 
    var tokenRegex = 
     new Regex(
      @"({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?({[a-zA-Z0-9_\-]*})*\.?\/?"); 
    Match tokenMatch = tokenRegex.Match(Domain); 
    for (int i = 0; i < tokenMatch.Groups.Count; i++) 
    { 
     Group group = tokenMatch.Groups[i]; 
     if (group.Success) 
     { 
      string key = group.Value.Replace("{", "").Replace("}", ""); 
      if (values.ContainsKey(key)) 
       values.Remove(key); 
     } 
    } 

    return values; 
    } 
} 

Referenz: Domain Routing in MVC5