2013-09-06 19 views
12

Potrzebuję kontrolera, aby zwrócił JSON do wykorzystania przez JavaScript, więc odziedziczyłem po klasie ApiController, ale nie zachowuje się tak, jak się spodziewałem. Apress książka Pro ASP.NET MVC 4 i większość przykładów internetowych znalazłem podać przykłady takich jak:Web API route to action name

public class ServicesController : ApiController 
{ 
    public string[] MethodFruit() 
    { 
     return new string[] { "Apple", "Orange", "Banana" }; 
} 

dostępne poprzez URL:

http://mysite/services/methodfruit 

Ale to nigdy nie działa - ISN zasobem nie znaleziono. Jedynym podejściem mogę dostać pracy ma mieć kontroler zawierać inną metodę dla każdego czasownika HTTP, a następnie:

http://mysite/api/services 

który wywołuje metody GET.

Sprawdziłem stronę internetową firmy Apress, ale nie mają oni forów, a obecny kod źródłowy jest w VS 2012, którego nie używam. Zbadałem pliki źródłowe i wydaje się, że poprzednie podejście powinno działać. Czy poprzednie podejście nie jest już obsługiwane?

Odpowiedz

27

Tak ... ogólnie musisz przestrzegać domyślnej konwencji nazewnictwa oczekiwanej przez API ASP.NET WEB.

Sprawdź to oficjalny dokument:

Routing in ASP.NET Web API

Jeśli nie chcesz śledzić konwencję, można spróbować Routing przez działanie Nazwa odcinka opisanego w powyższym połączonego doc.

Routing przez nazwa akcji

Z szablonu domyślnego routingu, Web API wykorzystuje metodę HTTP wybierz akcję. Jednak można również utworzyć trasę, gdzie nazwa działanie jest zawarte w URI:

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

W twoim przypadku trzeba by to zrobić:

[HttpGet] 
public string[] MethodFruit() 
{ 
    return new string[] { "Apple", "Orange", "Banana" }; 
} 
+0

Dzięki. Przeczytam ten dokument. – David

+1

Zrobiłem to samo. Ale chcę, aby ta funkcja została wywołana na żądanie 'POST'. Dodałem do ścieżki '{action}' i dodałem '[AcceptVerbs (" GET "," POST ")]' zamiast '[HttpGet]'. Ale mówi 404, kiedy uzyskuje dostęp do tego API, wysyłając prośbę o wpis. Gdy nie ma problemu z 'GET'. Moja nazwa akcji to 'GetAuthToken'. Naprawdę nie mogę tego rozwiązać. Proszę pomóż. – shashwat

+0

@shashwat sprawdź, czy to rozwiązuje twój problem: http://stackoverflow.com/a/12766431/114029 –

6

Jeśli chcesz Web API szukać nazwy akcji podczas trasy, zmienić klasę WebApiConfig.cs w folderze App_Start do tego:

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

Następnie można j Ust uczynić żądanie GET do

http://mysite/api/Services/MethodFruit 
+0

Brakowało mi WebApiConfig. Klasa cs całkowicie. Teraz ma to o wiele więcej sensu - zastanawiałem się, dlaczego klasa RouteConfig się nie zmieniła ... – David

4

dodaję dodatkowe informacje na temat powyższej odpowiedzi .. Dodawanie RoutePrefix będzie rozwiązać ten problem ..Nadzieję, że pomoże

Controller

[RoutePrefix("api/Services")] 
    public class ServicesController : ApiController 
    { 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     [Route("MethodFruit")] 
     public string[] MethodFruit() 
     { 
      return new string[] { "Apple", "Orange", "Banana" }; 
     } 
    } 

w config

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

Używanie [RoutePrefix ("api/referencedata")] i [Route ("products")] na metodzie akcji było jedyną rzeczą to zadziałało dla mnie. Nie działa, gdy użyłem [Route ("api/referencedata")] [ActionName ("produkty")] – MartinS

0

ja stoi sam problem, i okazało się, że na moim kodu

using System.Web.Mvc; 

ja już importowanego MVC intead korzystania z System.Web.Http. , więc korzystałem z trasy Mvc, a nie webApi. kiedy zastąpiłem że z

using System.Web.Http 

i to działa na mnie. Dodaję moją odpowiedź, więc nowicjusze nie powtórzą tego samego błędu.