Multiple IHTTPazionSulsults Get's all'interno di un singolo Apicontroller fallisce
-
21-12-2019 - |
Domanda
Sto giocando con Webapi2 e mi sono imbattuto in un problema strano.
Ho aggiornato il ValueScontroller predefinito per utilizzare IHTTPACTIONResult
come
public class ValuesController : ApiController
{
// GET api/values
[HttpGet]
public IHttpActionResult Get()
{
return Ok(new string[] { "value1", "value2" });
}
// GET api/values/get2
[HttpGet]
public IHttpActionResult Get2()
{
return Ok(new string[] { "value1", "value2" });
}
.
Quando provo Call Get () all'interno del postino ottengo un errore
.{ "Messaggio": "Si è verificato un errore.", "ExceptMessage": "Sono state trovate più azioni che corrispondono alla richiesta: \ r \ nSystem.web.http.httpactionResult Get () on Type Webapplication1.Controllers.Valuescontroller \ r \ nsystem.web.http.ihttpactionResult Get2 () on Type WebApplication1 .Controllers.Valuescontroller ", "EccezioneType": "system.invalidoperationexception", "Stacktrace": "A System.Web.HTTP.Controllers.apicontrollerationActionelector.actionSelectorCacheItem.Selection (httpControllerConText ControllequentText) \ R \ N su System.Web.http.controllers.apicontrollerationActionelector.selection (httpControllerContExt ControllerContext) \ R \ N al sistema. Web.http.apicontroller.ecuteasync (httpControllerContext ControllerConText, CancellationToken CancellationToken) \ R \ N su System.Web.http.dispatcher.httpControllerDispatcher.SendasynCcore (richiesta HTTPRequestMessage, CancellationToken CancellationToken) \ R \ N su System.Web.http.dispatcher. Httpcontrollerdispatcher.d__0.dovext () " }
Devo creare manualmente un percorso per ognuno per far funzionare questo?
Qualcosa di così semplice, ancora causandomi un mal di testa!
Soluzione
È perché hai due richieste di ricezione che non prendono parametri, quindi Webapi non ha modo di differenziare tra i due.Un modo sarebbe quello di impostare diversi percorsi per ogni metodo come dici tu.Il modo più semplice per aggirare questo è quello di usare il instradamento degli attributi libreria che consente di definire percorsi diversi sul controller eI livelli di azione sono semplicemente semplicemente così:
[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
[GET("Get")]
public IHttpActionResult Get()
{
return Ok(new string[] { "value1", "value2" });
}
[GET("Get2")]
public IHttpActionResult Get2()
{
return Ok(new string[] { "value1", "value2" });
}
}
.