Как определить одно действие для обработки всех HTTP-запросов GET, поступающих на этот контроллер?

Вот определение маршрута:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{*data}",
            defaults: new { data= RouteParameter.Optional }
        );

Теперь в контроллере продукта у меня есть действие, определенное следующим образом:

public string Get(string data="")
{
    return "value";
}

Я тестирую http-get со следующим URL

api/product/   
api/product/apple

оба работают

Но если я использую этот URL

api/product/?p=5

это выкинет исключение

No action was found on the `controller` 'product' that matches the request.

я понимаю, что могу определить другое действие, подобное этому, для решения проблемы

public string Get(int p,string data="")
{
    return "value";
}

Но у меня это не сработает, потому что параметры на url непредсказуемы, ни название параметров, ни значение параметров.

Итак, мой вопрос

Есть ли способ определить одно действие для обработки всех http-get запросов, поступающих на этот контроллер, независимо от того, какая строка запроса используется в URL-адресе?


person liuhongbo    schedule 03.06.2012    source источник
comment
Что происходит, когда вы делаете api/product?p=5? Я не могу сказать, что когда-либо видел URL-адрес, за которым непосредственно следует / после строки запроса.   -  person Justin Pihony    schedule 03.06.2012


Ответы (1)


Вы можете перегрузить Get с помощью WebAPI:

public string Get(int p) {}
public string Get(string data) {}

Хотя это исключает случай, когда вы не передаете никаких параметров, насколько я понимаю ваш сценарий, следует применять любой метод (либо имя, либо значение), и это должно быть хорошо.

person DazWilkin    schedule 06.06.2012