it-swarm.com.de

Es wurden mehrere Aktionen gefunden, die der Anforderung in Web Api entsprechen

Ich erhalte diese Fehlermeldung ständig, wenn ich versuche, zwei "Get" -Methoden zu verwenden

Es wurden mehrere Aktionen gefunden, die der Anfrage entsprechen: webapi

Ich habe mir die anderen ähnlichen Fragen zu Stack angesehen, aber ich verstehe das nicht.

Ich habe 2 verschiedene Namen und verwende das Attribut "HttpGet"

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}
212
chobo2

Ihre Routenkarte sieht wahrscheinlich so aus:

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

Um jedoch mehrere Aktionen mit derselben http-Methode auszuführen, müssen Sie dem Webapi über die Route weitere Informationen zur Verfügung stellen, z.

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

Beachten Sie, dass die routeTemplate jetzt eine Aktion enthält. Viele weitere Infos hier: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Update:

Okay, jetzt, wo ich glaube, dass ich verstehe, worauf du hinaus willst, ist hier eine weitere Einstellung:

Möglicherweise benötigen Sie den Parameter action url nicht und sollten den Inhalt, nach dem Sie suchen, auf andere Weise beschreiben. Da Sie sagen, dass die Methoden Daten von derselben Entität zurückgeben, lassen Sie einfach die Parameter die Beschreibung für Sie durchführen.

Zum Beispiel könnten Ihre zwei Methoden in verwandelt werden:

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

Welche Daten übergeben Sie im MyVm-Objekt? Wenn Sie Variablen nur über die URI übergeben können, würde ich vorschlagen, diese Route zu wählen. Andernfalls müssen Sie das Objekt im Hauptteil der Anforderung senden, und das ist bei einem GET nicht unbedingt HTTP von Ihnen (es funktioniert jedoch, verwenden Sie einfach [FromBody] vor MyVm).

Hoffentlich zeigt dies, dass Sie mehrere GET-Methoden in einem einzigen Controller verwenden können, ohne den Aktionsnamen oder sogar das Attribut [HttpGet] zu verwenden.

424
Jed

Update ab Web-API 2. 

Mit dieser API-Konfiguration in Ihrer Datei WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

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

Sie können unseren Controller folgendermaßen routen:

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    rturn null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

Dabei ist ControllerName der Name Ihres Controllers (ohne "Controller"). Auf diese Weise können Sie jede Aktion mit der oben beschriebenen Route abrufen.

Für weitere Informationen: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

55
Marc Stevenson

In der Web-API (standardmäßig) werden Methoden basierend auf einer Kombination von HTTP-Methoden- und Routenwerten ausgewählt. 

MyVm sieht aus wie ein komplexes Objekt, das vom Formatierer aus dem Rumpf gelesen wird, so dass Sie bezüglich der Routendaten zwei identische Methoden haben (da keine Parameter über die Route verfügen). Dadurch kann der Dispatcher (IHttpActionSelector) nicht mit dem übereinstimmen geeignet.

Sie müssen sie entweder durch Abfragen oder durch Routenparameter unterscheiden, um Mehrdeutigkeiten aufzulösen.

14
Filip W

Nach einer langen Suche im Internet und dem Versuch, das am besten geeignete Formular für die Routing-Map zu finden, __., Wenn Folgendes gefunden wurde 

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

Diese Zuordnung gilt sowohl für die Zuordnung von Aktionsnamen als auch für die grundlegende http-Konvention (GET, POST, PUT, DELETE). 

12
Moatasem bakri

Ohne Aktionen wären die Optionen:

  1. verschieben Sie eine der Methoden auf einen anderen Controller, damit sie nicht kollidieren.

  2. verwenden Sie nur eine Methode, die den Parameter übernimmt. Wenn dies der Fall ist, rufen Sie die andere Methode aus Ihrem Code auf.

5
Joanna Derks

Möglicherweise werden Ihre Webmethoden auf dieselbe URL aufgelöst. Schauen Sie sich den folgenden Link an: -

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Daher müssen Sie möglicherweise Ihren Methodennamen zu Ihrer Routingtabelle hinzufügen.

4
Max

Ich fand, dass, wenn ich zwei Get-Methoden habe, eine parameterlose und eine mit einem komplexen Typ als Parameter, dass ich den gleichen Fehler erhielt. Ich löste dieses Problem, indem ich einen Dummy-Parameter vom Typ int mit dem Namen Id als ersten Parameter und anschließend meinen Parameter für den komplexen Typ hinzufügte. Ich habe dann den Parameter "complex type" zur Routenvorlage hinzugefügt. Folgendes hat für mich gearbeitet.

Erste bekommen:

public IEnumerable<SearchItem> Get()
{
...
}

Zweite erhalten:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

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

Diese Lösung hat für mich funktioniert.

Bitte platzieren Sie Route2 zuerst in WebApiConfig. Fügen Sie vor jeder Methode HttpGet und HttpPost hinzu und schließen Sie den Controller-Namen und den Methodennamen in die URL ein.

WebApiConfig =>

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

Controller => 

public class ValuesController : ApiController
{

    [HttpPost]
    public string GetCustomer([FromBody] RequestModel req)
    {
        return "Customer";
    }

    [HttpPost]
    public string GetCustomerList([FromBody] RequestModel req)
    {
        return "Customer List";
    }
}

URL => 

http://localhost:7050/api/Values/GetCustomer

http://localhost:7050/api/Values/GetCustomerList
3
Alan Rezende

Bitte überprüfen Sie, ob Sie zwei Methoden haben, die den unterschiedlichen Namen und die gleichen Parameter haben. 

Wenn ja, löschen Sie bitte eine der Methoden und versuchen Sie es.

2
Ramesh

Es ist möglich, dass der MVC-Controller anstelle des Web-API-Controllers verwendet wird .. __ Überprüfen Sie den Namespace im Web-API-Controller

using System.Net;
using System.Net.Http;
using System.Web.Http;

Wenn der Namespace wie folgt lautet, wird ein Fehler beim Aufruf der Web-API-Controller-Methode angezeigt

using System.Web;
using System.Web.Mvc;
2
Ujwal Khairnar

Ich bin über dieses Problem gestolpert, als ich versuchte, meine WebAPI-Controller mit zusätzlichen Aktionen zu erweitern.

Angenommen, du hättest

public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

[HttpGet]
public void ReSeed()
{
    // Your custom action here
}

Es gibt jetzt zwei Methoden, die die Anforderung von/api/controller erfüllen, wodurch das von TS beschriebene Problem ausgelöst wird.

Ich wollte meinen zusätzlichen Aktionen keine "Dummy" -Parameter hinzufügen, also habe ich mich mit Standardaktionen befasst und kam zu:

[ActionName("builtin")]
public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

für die erste Methode in Kombination mit der "dualen" Routenbindung:

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

config.Routes.MapHttpRoute(
    name: "CustomActionApi",
    routeTemplate: "api/{controller}/{action}");

Obwohl es in der ersten Routenvorlage keinen Parameter "action" gibt, können Sie anscheinend immer noch eine Standardaktion konfigurieren, die es uns ermöglicht, das Routing der "normalen" WebAPI-Aufrufe und die Aufrufe der zusätzlichen Aktion zu trennen.

2

Dies ist die Antwort für alle, die wissen, dass alles korrekt ist und 50 mal geprüft hat .....

Stellen Sie sicher, dass Sie nicht wiederholt RouteConfig.cs suchen.

Die zu bearbeitende Datei heißt WebApiConfig.cs

Außerdem sollte es wahrscheinlich genau so aussehen:

using System.Web.Http;

namespace My.Epic.Website
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
          config.MapHttpAttributeRoutes();

          // api/Country/WithStates
          config.Routes.MapHttpRoute(
            name: "ControllerAndActionOnly",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { },
            constraints: new { action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$" });

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

Ich hätte mir ungefähr 3 Stunden sparen können.

1
CarComp

In meinem Fall war alles in Ordnung

1) Web Config wurde ordnungsgemäß konfiguriert. 2) Das Routenpräfix und die Routenattribute waren ordnungsgemäß

Trotzdem bekam ich den Fehler. In meinem Fall zeigte das Attribut "Route" (durch Drücken von F12) auf System.Web.MVc, nicht jedoch auf System.Web.Http, was das Problem verursachte.

0
Hemanth Vatti

Sie können Ihrer Controller-Klasse [Route("api/[controller]/[action]")] hinzufügen.

[Route("api/[controller]/[action]")]
[ApiController]
public class MySuperController : ControllerBase
{
 ...
}
0
emert117

Zum Beispiel => TestController

        [HttpGet]
        public string TestMethod(int arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod2(string arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod3(int arg0,string arg1)
        {
            return "";
        }

Wenn Sie nur die Datei WebApiConfig.cs ändern können.

 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/",
                defaults: null
            );

Das ist es :)

Und Ergebnis:  enter image description here

0
Cemre Onur Baş

Stellen Sie sicher, dass Sie Ihre Controller-Methoden NICHT für die Standardaktionen GET | PUT | POST | DELETE mit dem Attribut [HttpPost/Put/Get/Delete] dekorieren. Ich hatte dieses Attribut zu meiner Vanilla Post-Controller-Aktion hinzugefügt, was eine 404 verursachte. 

Ich hoffe, das hilft jemandem, da es sehr frustrierend sein kann und den Fortschritt zum Stillstand bringen kann.

0
ComeIn

Ich weiß, dass dies eine alte Frage ist. Wenn Sie jedoch Serviceressourcen wie AngularJS verwenden, um eine Verbindung mit der WebAPI herzustellen, stellen Sie sicher, dass Sie die richtige Route verwenden. Andernfalls tritt dieser Fehler auf.

0
Suresh Kaushik

Haben Sie versucht, wie:

[HttpGet("Summary")]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
    return null;
}
0
Deepak Shaw