2 Stimmen

HTTP-Host-Header als Routenwert

Ich versuche, mehrere virtuelle Hosts von der gleichen Codebasis aus zu bedienen. Ein Gedanke, den ich hatte, war die HTTP-Host-Header als Route-Wert übergeben, weil ich nicht auf HttpContext in den Controllern wegen der Einheit Testbarkeit verlassen wollte.

Ich hatte geplant, diese Route Wert in einem Controller-Basisklasse oder etwas ähnliches aussetzen. Ich habe versucht, als eine Route Wert wie folgt übergeben:

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { host = HttpContext.Current.Request.Url.Host, controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Dies führt zu einer HttpException: Anfrage ist in diesem Kontext nicht verfügbar.

Für jede Idee oder jeden Vorschlag, wie man das besser machen könnte, wäre ich dankbar.

3voto

marcind Punkte 52454

Sie sollten sich beim Testen Ihres Controllers auf den Kontext verlassen können. Das Routing-System wurde mit Blick auf die Testbarkeit entwickelt, so dass Sie einen Mock-Kontext festlegen können, der die richtige URL liefert, wenn Ihre Tests laufen.

Der Grund, warum Ihr Code nicht funktioniert, ist, dass Sie ihn wahrscheinlich von der globalen Application_Start Ereignis, das eintritt, bevor die erste Anfrage eingeht. Dies bedeutet, dass ein HttpContext-Objekt zu diesem Zeitpunkt nicht verfügbar ist.

-1voto

Brett Styles Punkte 1

Versuchen Sie, Ihre HomeController wie folgt:

public ActionResult Index() {
    var request = HttpContext.Request.Url;

    if (request != null && request.AbsoluteUri.Contains("domain.com")) {
        //take the desired action and redirect here
    }

    //the rest of home controller logic
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X