Игнорирование параметров маршрута в ASP.NET MVC WebAPI - PullRequest
0 голосов
/ 28 августа 2018

У меня есть следующий контроллер веб-API:

public class ProductController : ProductControllerBase
{
 public async Task<string> Lookup(string id)
{
   // do lookup
}

public async Task<string> Search(string keywords)
{
    // do search
}
}

Примеры запросов к этому API:
http://localhost/api/product/Lookup?provider=amazon&id=B07CSPSMQY
http://localhost/api/product/Lookup?provider=walmart&id=4132478AB
http://localhost/api/product/Lookup?provider=ebay&id=EWRHNFKASDN231

Я выбираю провайдера в базовом классе, потому что я использую его для целей IoC:

public ProductControllerBase()
{
    string provider = HttpContext.Current.Request.QueryString["provider"];
    // resolve search provider depending on parameter
    SetController(provider);
}

В моем WebApiConfig у меня есть следующие настройки:

config.Routes.MapHttpRoute(
    "ProductControllerLookup",
    "api/product/Lookup/{provider}/{id}",
    new
    {

    }
);

но как только я запускаю URL выше, я получаю следующую ошибку:

{"Message":"The requested resource does not support http method 'GET'."}

Я хочу получить параметры, отличные от «provider», поскольку я не хотел использовать его для всех методов.

Как мне это настроить?

1 Ответ

0 голосов
/ 28 августа 2018

Я протестировал код только с добавлением атрибута [HttpGet], и, похоже, все в порядке, вот мой WebApiConfig

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

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

        config.Routes.MapHttpRoute(
           "ProductControllerLookup",
           "api/product/Lookup/{provider}/{id}",
            new {}
        );
    }

А вот и метод:

[System.Web.Http.HttpGet]
    public async Task<string> Lookup(string id)
    {
        var temp = HttpContext.Current.Request.QueryString["provider"];
        // do lookup
        return "";
    }

И я использую ваши URL, и все они используют метод, а ID и провайдер заполнены.

...