Frage

Ich erstelle einen WebApi2-Dienst und eine der Methoden, die ich implementieren möchte, stellt einen HTTP-GET von einem Objekt innerhalb einer internen Baumstruktur dar – die Anfrage würde also wie folgt lauten:

GET /values/path/path/to/object/in/tree

Ich möchte also, dass meine Methode „Pfad/zu/Objekt/in/Baum“ erhält.

Allerdings erhalte ich nur eine 404, wenn ich dies ausführe, und es ist interessant, dass ich eine 404 erhalte, die anders aussieht als die standardmäßige IIS 404.Es trägt den Titel „Serverfehler in „/“-Anwendung“, während das für eine völlig ungültige Ressource den Titel „HTTP-Fehler 404.0 – Nicht gefunden“ trägt.

Ich spiele mit der Standardvorlage herum, um zu sehen, ob ich das zum Laufen bekomme, daher die Ähnlichkeit.

Ich habe das für mich RouteConfig

public static void RegisterRoutes(RouteCollection routes)
{
    var route = routes.MapRoute(
               name: "CatchAllRoute",
                url: "values/path/{*pathValue}",
                defaults: new { controller = "Values", action = "GetPath" });
}

Und das ist mein ValuesController:

[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
    [Route("test/{value}")]
    [HttpGet]
    public string Test(string value)
    {
        return value;
    }

    [HttpGet]
    public string GetPath(string pathValue)
    {
        return pathValue;
    }
}

Interessanterweise, wenn ich davon abstamme Controller statt ApiController Es funktioniert einwandfrei, aber dann funktioniert das normale Attributrouting nicht.

Ich habe versucht, der Methodik in zu folgen dieser Beitrag (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) aber ich konnte es nicht zum Laufen bringen.

Ich bin mir sicher, dass mir etwas völlig Einfaches entgangen ist, aber nachdem ich ein paar Stunden damit verbracht habe, hielt ich es für klug zu fragen, was ich falsch mache.

Danke

M

War es hilfreich?

Lösung

Web-API-Routing ist nicht dasselbe wie MVC-Routing.anstatt

route.MapRoute

versuchen

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes

    config.Routes.MapHttpRoute(
        name: "CatchAll", routeTemplate: "values/path/{*pathvalue}", 
        defaults: new {id = RouteParameter.Optional });
}

Der Grund dafür, dass es vom Controller aus funktioniert, besteht darin, dass MapRoute das richtige Format für das Routing eines MVC-Controllers ist, während MapHttpRoute für API-Controller konzipiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top