2017-02-17 3 views
2

Ich versuche, die Subdomains auf Bereiche zuordnen, Bisher waren alle Antworten, die ich für ältere Versionen von .NET und nicht .NET Core gefunden. Die beste und relevanteste Antwort, die ich fand, war von This page. Allerdings habe ich ein Problem, es zu implementieren, da es scheint, dass die Walkthrough für eine frühere Version von .NET-Core und ich bin der 'MvcRouteHandler' does not contain a constructor that takes 0 arguments Error bekommen.ASP.NET Core Mapping Subdomains auf Bereiche

Hier ist der Code, den ich aus den Fehler:

public class AreaRouter : MvcRouteHandler, IRouter //the error happens in this line, visual studio underlines the AreaRoute word 
{ 
    public new async Task RouteAsync(RouteContext context) 
    { 
     string url = context.HttpContext.Request.Headers["HOST"]; 

     string firstDomain = url.Split('.')[0]; 
     string subDomain = char.ToUpper(firstDomain[0]) + firstDomain.Substring(1); 

     string area = subDomain; 

     context.RouteData.Values.Add("area", subDomain); 

     await base.RouteAsync(context); 
    } 
} 

so wie auch immer, ich für eine andere Art und Weise suchen Subdomains Bereiche abzubilden oder eine Art und Weise zu beheben diesen Fehler zu finden.

+0

In welcher Zeile beschwert sich der Compiler? – Gusman

+0

@Gusman aktualisiert die Frage (es ist die erste Zeile) – soorena12

Antwort

0

Wenn Sie bei der Definition von MvcRouteHandler schauen, sehen Sie es nicht einen parameterlosen Konstruktor hat, sind die, die availables:

public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory); 
public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor); 

Wie Sie es sind vererben, können Sie den Basiskonstruktor nennen müssen, so in der Regel würden Sie einen Konstruktor mit den gleichen Parametern erstellen und an der Basis passieren, wie Sie keine zusätzlichen Parameter erforderlich:

public AreaRouter (IActionInvokerFactory actionInvokerFactory, 
    IActionSelector actionSelector, DiagnosticSource diagnosticSource, 
    ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor) 
    : base(actionInvokerFactory, actionSelector, diagnosticSource, 
    loggerFactory, actionContextAccessor) { } 
+0

jetzt bekomme ich einen Fehler ''MvcRouteHandler' enthält keinen Konstruktor, der 6 Argumente nimmt 'von der vierten Zeile des Codes, den Sie geschrieben haben. Nebenbei, während der Fehler verschwindet, kann ich den Anweisungen der Seite, von der ich diesen Code erhalten habe, nicht mehr folgen, da ich keine Ahnung habe, welche Werte an den AreaRouter in 'routes.DefaultHandler = new AreaRouter();' übergeben werden die startup.cs gemäß der Anweisung.und ich werde einen neuen Fehler bekommen – soorena12

+0

Über den ersten Fehler, das ist dann, weil die Version von .net Core Sie von mir unterscheiden, klicken Sie einfach mit der rechten Maustaste 'MvcRouteHandler' und wählen Sie dann" Go to Definition ", wird es ein Meta öffnen aus der Klasse und zeigen Ihnen die Funktionen der Klasse (und der Konstruktoren). Und da es nicht möglich ist, diese Anweisungen zu verwenden, ist das eine andere Frage, löse zuerst diesen Fehler und öffne dann eine neue Frage. – Gusman

+0

Nun, ich bin nicht darauf fixiert, das Mapping auf diese Weise zu machen, jeder andere Weg, der mir hilft, Subdomains in Bereiche zu mappen, ist in Ordnung. – soorena12

1

ich mit dem gleichen Problem bin zu kämpfen und ich es geschafft, nach vorne zu erhalten durch Hinzufügen mein Router auf ConfigureServices mit:

services.AddSingleton<AreaRouter>(); 

dann in das Verfahren Configure injizieren mit:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AreaRouter areaRouter) 

Und schließlich setzen sie an Ort und Stelle:

routes.DefaultHandler = areaRouter; 

dieses Problem Fixing bekam vorwärts mich, aber unfortunetaly ich noch couldn‘ t das Subdomain-Routing funktioniert wie gewünscht. Es scheint, als ob die Routing-Entscheidung bereits an dieser Stelle getroffen wurde.

Hinweis: Ich hätte nur einen Kommentar hinzugefügt, aber ich kann das noch nicht tun.

5

Bearbeiten: Komplette Tutorial verfügbar here. Wird verwaltet, um eine funktionierende Version Ihrer Datei zu erstellen.
1. Code für Router ist verfügbar here. Spezifizieren Sie Ihre eigenen Subdomains in _allowedSubdomains Array über der Datei.

app.UseMvc(routes => 
     { 
     routes.DefaultHandler = areaRouter; 

areaRouter sollte durch @mepsi beschrieben übergeben werden:
2. Nach dem Router hinzufügen, den Code in Startup.cs ändern.
3. Schließlich erlauben Sie die Verwendung von Sudomains wie beschrieben here.
Alles sollte jetzt funktionieren. Der vollständige Code ist unter Github verfügbar. Ich werde später ein komplettes Tutorial mit allen Erklärungen schreiben.