Основная проблема, с которой вы сталкиваетесь, заключается в том, что текущая версия WCF REST вызывает перенаправление 307 (на "/"), когда в атрибуте WebGet есть пустая строка для UriTemplate. , Насколько я знаю, в текущей версии обойти это невозможно.
Тем не менее, есть несколько «средних» решений для вашей проблемы, учитывая, что вы хотите решение, которое 1) позволяет дифференцировать услуги и 2) имеет (относительно) короткие URI.
Первое решение
Вы можете поместить это в свой файл global.asax (для этого примера ). Вы можете сделать маршрут обслуживания для каждой услуги:
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));
RouteTable.Routes.Add(new ServiceRoute("trucks", new WebServiceHostFactory(), typeof(TruckService)));
На данный момент вы можете заполнить свой UriTemplate в каждой службе:
[WebGet(UriTemplate = "all")]
CarPool GetAllCars();
[WebGet(UriTemplate = "{carName}")]
Car GetCar(string carName);
Это позволит вам URI:
www.domain.com/cars/all
www.domain.com/cars/123 or www.domain.com/cars/honda
аналогично для грузовых автомобилей:
www.domain.com/trucks/all
www.domain.com/trucks/123 or www.domain.com/trucks/ford
Второе решение
Используйте сервисный хост из REST Starter Kit (т. Е. WebServiceHost2Factory).
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));
Это не приводит к перенаправлению 307 при использовании URI, которые вы пытаетесь использовать выше, и, таким образом, дает вам именно то, что вам нужно. Хотя я понимаю, что это немного странно, если использовать эту фабрику хоста службы, а не ту, которая поставляется с WCF 4.