2015-07-31 12 views
5

Mam akcje, które mają różne parametry typów.Web Api Wiele działań zostało znalezionych

public class MyController : ApiController 
{  
    [HttpPost] 
    public UpdateFeatureResponse UpdateFeature(UpdateFeatureResuest reqResuest) 
    { 
     return new UpdateFeatureResponse { IsSuccess = true }; 
    } 

    [HttpPost] 
    public DeleteFeatureResponse DeleteFeature(DeleteFeatureRequest request) 
    { 
     return new DeleteFeatureResponse{ IsSuccess = true }; 
    } 

} 

A moje typy żądań są tak:

public class UpdateFeatureResuest 
{ 
    public int Id { get; set; } 
    public string Feature { get; set; } 
} 

public class UpdateFeatureResponse 
{ 
    public bool IsSuccess { get; set; } 
} 

public class DeleteFeatureRequest 
{ 
    public int Id { get; set; } 
} 

public class DeleteFeatureResponse 
{ 
    public bool IsSuccess { get; set; } 
} 

Trasa jest tutaj:

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

Kiedy wysłać żądanie (http://localhost:52285/api/My/UpdateFeature) poprzez Skrzypek zwraca HTTP/1.1 500 Internal Błąd serwera

Komunikat o błędzie i s:

{ "message": "Wystąpił błąd.", "exceptionMessage": "Wiele działań stwierdzono, że pasuje do żądania: \ r \ nUpdateFeature od typu WebGUI.Controllers.MyController \ r \ nDeleteFeature od typu WebGUI.Controllers.MyController „«exceptionType»:«System.InvalidOperationException»,«stackTrace»:” .....

+0

Co URL nie używasz i co robi swój wygląd routingu jak? – DavidG

Odpowiedz

4

trasa jest błędne, gdyż nie określa nazwę akcji, dlatego traktując część UpdateFeature jako parametr ID. Zmień to na:

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

Moja trasa jest domyślną trasą szablonu web api. Ale Twoje rozwiązanie działa. Dzięki – barteloma

0

Lepiej używać atrybutu Route.

Na przykład

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{  
    [Route("update")] 
    [HttpPost] 
    public UpdateFeatureResponse UpdateFeature(UpdateFeatureResuest reqResuest) 
    { 
     return new UpdateFeatureResponse { IsSuccess = true }; 
    } 

    [Route("delete")] 
    [HttpPost] 
    public DeleteFeatureResponse DeleteFeature(DeleteFeatureRequest request) 
    { 
     return new DeleteFeatureResponse{ IsSuccess = true }; 
    } 

} 

teraz dodać do swojej WebApiConfig przed config.Routes.MapHttpRoute()

config.MapHttpAttributeRoutes();