2016-09-18 9 views
1

Ich habe eine WebAPI erstellt und versucht, mit ActionName zu den richtigen Methoden zu routen. Es funktioniert mit einer meiner Methoden, die ich aufrufen möchte, aber die andere bekommt einen 404 Fehler.WebAPI ActionName-Routing-Halbfunktion

Meine WebAPI Config-Datei:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

Meine WebAPI Controller-Methoden werden als solche formatiert:

Das erste ist die Arbeit ein:

[ActionName("postdb")] 
public IEnumerable<string[]> postDB(string id) 
{ ... 

Das zweite nicht:

[ActionName("getquery")] 
public IEnumerable<string[]> getQuery(string tables) 
{ ... 

Ich rufe beide von ihnen die gleiche Art und Weise aus Winkel (Temp eine Zeichenfolge, die als Argument übergeben wird):

$http.post('api/Test/postdb/' + temp).then(function (response) { ... 

und

$http.get('api/Test/getquery/' + temp).then(function (response) { ... 

ich Namen beiden Aktionen versucht habe, zu ändern Der erste funktioniert unabhängig vom Namen, der zweite funktioniert nicht, egal wie der Name lautet. Ich habe auch versucht, sie neu zu ordnen, zwischen GET und POST zu wechseln und Argumente zu ändern.

Irgendwelche Vorschläge?

Antwort

2

Nicht sicher, warum Sie ActionName verwenden, um Routing einzurichten?

Sie sollten wahrscheinlich Route Attribut suchen. z.B.

[HttpPost] 
[Route("postdb")] 
// Action doesn't have to be called 'postdb' 
public IEnumerable<string[]> postDB(string id) 

ActionName ist in der Regel für einen anderen Zweck (Purpose of ActionName)

denken Trotzdem habe ich etwas seltsam in Ihrem Beispiel los ist - ich glaube, würde Einstellung ActionName sollte es nicht Routing betroffen. Um zu debuggen, würde ich vorschlagen, fehlgeschlagene Anfrageverfolgung einzurichten, um zu sehen, an welcher Stelle die Anfrage die Aktion nicht erreicht.

Dies sind die grundlegenden Regeln für die Auswahl Aktion in WebAPI (http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection)

  1. Sie die HTTP-Methode mit einem Attribut angeben: AcceptVerbs, HttpDelete, HttpGet HttpHead, HttpOptions, HttpPatch, Httppost, oder HttpPut.

  2. Andernfalls, wenn der Name der Controller-Methode mit "Get", "Post", "Put", "Löschen", "Head", "Optionen" oder "Patch" beginnt, dann per Konvention die Aktion unterstützt diese HTTP-Methode.

  3. Wenn keine der oben genannten, unterstützt die Methode POST.

Also, in Ihrem Beispiel postdb Methode kann Karte auf der POST-Methode. Aber kann sein, weil es in Kleinbuchstaben ASP ist.NET hat das nicht gefallen und angewendet Regel 3 - versuchen Sie mit ActionName("PostDB") und [ActionName("GetQuery")], wenn Sie wirklich ActionName (aus welchem ​​Grund auch immer) anstelle von Route verwenden möchten.

+0

Danke für den Rat. Ich werde daran arbeiten, es zu ändern! – user6846524

0

Der Name des Parameters tables in der zweiten Aktion

[ActionName("getquery")] 
public IEnumerable<string[]> getQuery(string tables) 
{ ... 

nicht mit dem Namen des Parameters id in der Route:

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