Pytanie Prowadź wszystkie żądania Web API do jednej metody kontrolera


Czy istnieje możliwość dostosowania mechanizmu routingu ASP.NET Web API do kierowania wszystkich żądań do API na jedną metodę kontrolera?

Jeśli żądanie przychodzi do

www.mysite.com/api/products/

lub

www.mysite.com/api/otherResource/7

Wszystkie zostałyby przekierowane do metody Get () mojego SuperDuperControllera?


11
2018-06-24 09:21


pochodzenie


możesz być zainteresowany asp.net/web-api/overview/web-api-routing-and-actions/... - Amit Kumar Ghosh


Odpowiedzi:


Wpadłem na przypadek, w którym musiałem to zrobić. (Web API 2)

Najpierw zajrzałem do tworzenia niestandardowych IHttpControllerSelector i IHttpActionSelectors. To jednak było trochę mętne. W końcu zdecydowałem się na tę martwą prostą implementację. Wszystko, co musisz zrobić, to ustawić trasę wieloznaczną. Przykład:

public class SuperDuperController : ApiController
{
    [Route("api/{*url}")]
    public HttpResponseMessage Get()
    {
        // url information
        Request.RequestUri
        // route values, including "url"
        Request.GetRouteData().Values
    }
}

Każde żądanie GET zaczynające się od "api /" zostanie przekierowane do powyższej metody. Dotyczy to wyżej wymienionych adresów URL w pytaniu. Będziesz musiał samodzielnie wykopać informacje z Żądania lub obiektów kontekstu, ponieważ ominie to automatyczną wartość trasy i parsowanie modelu.

Dobrą rzeczą jest to, że nadal możesz używać innych kontrolerów (o ile ich trasy nie zaczynają się od "api /").


8
2017-07-17 04:10





Nie wiem, dlaczego chciałbyś to zrobić i na pewno nie poleciłbym routingu wszystkiego za pomocą jednego kontrolera, jednak możesz to osiągnąć w następujący sposób. Zakładając, że będziesz mieć tylko zasób z opcjonalnym identyfikatorem w swoich połączeniach, dodaj to do swojego WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{resource}/{id}",
            defaults: new { controller = "SuperDuper", id = RouteParameter.Optional }
        );
    }
}

Następnie określ swoją metodę kontrolera w następujący sposób:

public class SuperDuperController : ApiController
{
    public IHttpActionResult Get(string resource, int? id = null)
    {
        return Ok();
    }
}

Musisz podjąć decyzję w sprawie odpowiedniego IHttpActionResult zwrócić dla każdego innego rodzaju zasobu.

Alternatywnie za pomocą Attribute Routing, upewnij się, że config.MapHttpAttributeRoutes() jest obecny w twoim WebApiConfig i dodaje następujące atrybuty do twojej metody kontrolera:

[RoutePrefix("api")]
public class SuperDuperController : ApiController
{
    [Route("{resource}/{id?}")]
    public IHttpActionResult Get(string resource, int? id = null)
    {
        return Ok();
    }
}

1
2017-07-06 09:43