MVC2-Routing mit WCF ServiceRoute: Html.ActionLink rendering falsche links!
Ich habe einen WCF service, der lebt side-by-side mit einer MVC2-web-site. Ich möchte für meine URL für den service wie folgt Aussehen:
http://localhost/projdir/Service
Dem MVC-Website ist in den Kinderschuhen, also es hat immer noch alle Ihre boilerplate-Controller etc.
Der folgende code funktioniert auf den ersten Blick im Allgemeinen.asax:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new ServiceRoute("Service", new ServiceHostFactory(),
typeof(MyService)));
routes.MapRoute(
"Default", //Route name
"{controller}/{action}/{id}", //URL with parameters
new { controller = "Home", action = "Index",
id = UrlParameter.Optional } //Parameter defaults
);
}
Der Dienst erscheint nur, wo ich beschrieben und funktioniert wie beworben. Toll.
Allerdings habe ich gerade bemerkt, dass die Bestellung meinen code auf diese Weise können änderungen alle meine ActionLink
's. Zum Beispiel, die "Über" - tab auf der MVC-Seite erscheint nun so:
http://localhost/projdir/Service?action=About&controller=Home
Dies ist offensichtlich falsch (es sollte http://localhost/projdir/Home/About/
).
Wenn ich den ServiceRoute
unten neben der Standard - MapRoute()
anrufen, dann bekomme ich einen fehlenden controller-Fehler. (Tatsächlich bekomme ich ein "StructureMapControllerFactory nicht zurück eine Instanz einer controller" Fehler, weil ich bin verdrahtet mit StructureMap, duh, es ist nicht ein controller, um mit zu beginnen.)
Interessanterweise scheint es nur zu sein, die die Ausgabe von Html.ActionLink()
. Ich kann Sie manuell eingeben, in http://localhost/projdir/Home/About/
und Holen Sie auf der richtigen Seite.
Was schrecklich offensichtlich newbie Fehler bin ich?
- Eventuell damit zusammenhängen? stackoverflow.com/questions/1470997/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, die Service-route nach das MVC-route. Aber um zu vermeiden, das "missing controller" Fehlermeldung, die Sie haben vor, fügen Sie das MVC-route mit eine Route Einschränkung. Diese route constraints werden kann Regex - im Grunde wollen Sie Ihre route Einschränkung werden alle controller, die nicht "Service". Wenn eine Anforderung für "Service" angefordert wird, wird es fallen durch und seine WCF-Service Route.
new { controller = "^{?!Service}"}
als der Einschränkung, und es funktionierte wie ein Charme. Verstehen Sie, warum die service-route kann nicht vor das MVC-route durch?^(?!Service).*
Ich gelöst mit:
Ich hoffe, dass dies gut für Sie
Andere Lösung ist, um zu Erben der ServiceRoute und überschreiben Sie die
GetVirtualPath
Methode zurücknull
wie beschrieben hierDiese Weise, reverse-route-mapping nie wählen Sie diese route für jede Aktion. Funktioniert wie ein Charme