wake-up-neo.com

Web-API-Route zum Aktionsnamen

Ich brauche einen Controller, um JSON zurückzugeben, damit er von JavaScript konsumiert wird, also habe ich die ApiController-Klasse geerbt, aber sie verhält sich nicht wie erwartet. Das Apress-Buch Pro ASP.NET MVC 4 und die meisten Online-Beispiele, die ich gefunden habe, geben Beispiele wie:

public class ServicesController : ApiController
{
    public string[] MethodFruit()
    {
        return new string[] { "Apple", "Orange", "Banana" };
}

zugriff über die URL:

http://mysite/services/methodfruit

Das funktioniert aber nie - die Ressource wird nicht gefunden. Der einzige Ansatz, den ich zum Laufen bringen kann, besteht darin, dass der Controller für jedes HTTP-Verb eine andere Methode enthält.

http://mysite/api/services

Was ruft die GET-Methode auf.

Ich habe auf der Apress-Website nachgesehen, aber es gibt anscheinend keine Foren. Der aktuelle Quellcode ist in VS 2012, den ich nicht verwende. Ich habe die Quelldateien untersucht und sie scheinen zu glauben, dass der bisherige Ansatz funktionieren sollte. Wird der bisherige Ansatz nicht mehr unterstützt?

13
David

Ja, im Allgemeinen müssen Sie die von ASP.NET WEB API erwartete Standardbenennungskonvention einhalten.

Überprüfen Sie dieses offizielle Dokument:

Routing in ASP.NET-Web-API

Wenn Sie die Konvention nicht befolgen möchten, können Sie den Abschnitt Routing by Action Name versuchen, der im oben verlinkten Dokument beschrieben wird.

Routing nach Aktionsname

Bei der standardmäßigen Routingvorlage verwendet das Web-API die HTTP-Methode für Wählen Sie die Aktion aus. Sie können jedoch auch eine Route erstellen, in der die Aktionsname ist in der URI enthalten:

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );

In Ihrem Fall müssten Sie Folgendes tun:

[HttpGet]
public string[] MethodFruit()
{
    return new string[] { "Apple", "Orange", "Banana" };
}
29

Wenn Sie möchten, dass das Web-API beim Routing nach dem Aktionsnamen sucht, ändern Sie die Klasse WebApiConfig.cs im Ordner App_Start wie folgt:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Dann können Sie einfach eine GET-Anfrage an 

http://mysite/api/Services/MethodFruit
7
Mahesh

Zusätzliche Informationen zur obigen Antwort hinzufügen. Das Hinzufügen von RoutePrefix würde das Problem manchmal beheben. Ich hoffe es hilft

Regler

    [RoutePrefix("api/Services")]
    public class ServicesController : ApiController
    {
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        [System.Web.Http.HttpGet]
        [Route("MethodFruit")]
        public string[] MethodFruit()
        {
            return new string[] { "Apple", "Orange", "Banana" };
        }
    }

In der Konfig 

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );
5
Praveen M P

ich war mit demselben Problem konfrontiert, ich fand das auf meinem Code

using System.Web.Mvc; 

ich habe Mvc importiert, indem ich System.Web.Http ..__ verwendet habe

using System.Web.Http 

und es funktioniert für mich. Ich füge meine Antwort hinzu, damit Neulinge nicht denselben Fehler wiederholen

0
Uttam Ughareja