ASP.NET Web Api: la risorsa richiesta non supporta il metodo http "GET"


92

Ho la seguente azione su un ApiController:

public string Something()
{
    return "value";
}

E ho configurato i miei percorsi come segue:

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

Nella beta, ha funzionato bene, ma ho appena aggiornato all'ultima Release Candidate e ora vedo errori in chiamate come questa:

La risorsa richiesta non supporta il metodo http "GET".

Perché non funziona più?

(Suppongo che potrei sbarazzarmi di {action} e creare un sacco di controller, ma sembra disordinato.)

Risposte:


107

Se non hai configurato alcun HttpMethod sulla tua azione nel controller, si presume che sia solo HttpPost in RC. In Beta, si presume che supporti tutti i metodi: GET, PUT, POST e Delete. Questo è un piccolo cambiamento da beta a RC. Puoi facilmente decorare più di un metodo http sulla tua azione con [AcceptVerbs ("GET", "POST")].


ho appena riscontrato questo, grazie per la correzione, ma curioso, perché devo farlo con i miei metodi personalizzati, ma non con il metodo "Get" predefinito? Ho un metodo Get che è stato creato dal modello per il controller, ma non è decorato. è solo per convenzione a causa del nome Get?
SelAromDotNet

3
@ Josh: Sì! Quando il nome del metodo di azione inizia con "Get ..." non è necessario contrassegnarlo come metodo GET. Leggi di più qui: asp.net/web-api/overview/web-api-routing-and-actions/…
Jenny O'Reilly

Ho fatto come suggerito nella risposta, ma ora entrambe le mie chiamate, Get e Post, vengono reindirizzate a Get Action. Qualche aiuto per favore?
Syed Ali Taqi

54

Tutte le informazioni di cui sopra sono corrette, vorrei anche sottolineare che l' [AcceptVerbs()]annotazione esiste in entrambi gli spazi dei nomi System.Web.Mvc e System.Web.Http.

Si desidera utilizzare System.Web.Http se si tratta di un controller API Web.


@Eric. Fantastico, questo era il motivo per cui non funzionava per me. Avevo il verbo sulla mia azione ma era referenziato tramite Web.Mvc, quindi non funzionava.
dreza

Fantastico, mi hai salvato la giornata
Hossein Narimani Rad

Grazie mille, perché System.Web.Mvc non era buono per me.
Burak Karakuş,

34

Sebbene questa non sia una risposta all'OP, ho avuto lo stesso identico errore da una causa principale completamente diversa; quindi nel caso in cui questo aiuti qualcun altro ...

Il problema per me era un parametro del metodo denominato in modo errato che causava a WebAPI l'instradamento imprevisto della richiesta. Ho i seguenti metodi nel mio ProgrammesController:

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

Le richieste DELETE a ... / api / programmi / 3 non venivano instradate a DeleteProgramme come mi aspettavo, ma a GetProgrammeById, perché DeleteProgramme non aveva un nome di parametro di id. GetProgrammeById stava quindi ovviamente rifiutando il DELETE in quanto è contrassegnato come accetta solo GET.

Quindi la soluzione è stata semplice:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

E va tutto bene. Errore stupido davvero ma difficile da eseguire il debug.


1
Se qualcuno sta utilizzando l'URL routing, prova a fare come [Route ("{programmeId = programmeId: int}")]
sree

1
Questo è stato per me. WebApiConfig -> MapHttpRoutes aveva -> routeTemplate: "api / {controller} / {id}", quindi è stato necessario utilizzare un parametro di "id".
HockeyJ

1
la tua risposta mi ha indicato il mio problema che era leggermente diverso Ho cambiato il nome di un parametro [FromUri] per il metodo e non l'ho aggiornato sul lato client
Matus

22

Se stai decorando il tuo metodo con HttpGet, aggiungi quanto segue usingnella parte superiore del controller:

using System.Web.Http;

Se si utilizza System.Web.Mvc, può verificarsi questo problema.


5
Questo è vero, e ridicolmente .NET non mostra chiaramente il messaggio.
Teoman shipahi

15

Questo è sicuramente un cambiamento da Beta a RC. Nell'esempio fornito nella domanda, ora devi decorare la tua azione con [HttpGet] o [AcceptVerbs ("GET")].

Ciò causa un problema se si desidera combinare azioni basate su verbi (ad esempio "GetSomething", "PostSomething") con azioni non basate su verbi. Se provi a utilizzare gli attributi di cui sopra, causerà un conflitto con qualsiasi azione basata sui verbi nel tuo controller. Un modo per ottenere arount sarebbe definire percorsi separati per ogni verbo e impostare l'azione predefinita sul nome del verbo. Questo approccio può essere utilizzato per definire le risorse figlio nella tua API. Ad esempio, il codice seguente supporta: "/ resource / id / children" dove id e children sono facoltativi.

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

Si spera che le versioni future dell'API Web offrano un supporto migliore per questo scenario. Attualmente è stato registrato un problema nel progetto codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Se è qualcosa che vorresti vedere, vota sulla questione.


8

Avere la stessa configurazione di OP. Un controller con molte azioni ... meno "disordinato" :-)

Nel mio caso ho dimenticato "[HttpGet]" quando si aggiunge una nuova azione.

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}

6

Stesso problema di cui sopra, ma radice molto diversa. Per me, era che stavo raggiungendo un endpoint con una regola di riscrittura https. Colpendolo su http ha causato l'errore, ha funzionato come previsto con https.


3

Sostituisci il codice seguente in questo percorso

Sentiero :

App_Start => WebApiConfig.cs

Codice:

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

1

Non so se questo possa essere correlato al post dell'OP ma mi mancava l'annotazione [HttpGet] e questo era ciò che stava causando l'errore, come affermato da @dinesh_ravva, i metodi si presume siano HttpPost per impostazione predefinita.


0

Il mio problema era semplice come avere un riferimento nullo che non veniva visualizzato nel messaggio restituito, ho dovuto eseguire il debug della mia API per vederlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.