您遇到的主要问题是current当 WebGet 属性中的 UriTemplate 为空字符串时,WCF REST 版本会导致 307 重定向(到“/”)。据我所知,当前版本无法解决此问题。
但是,如果您想要一个解决方案,1) 允许您区分服务,2) 具有(相对)短的 URI,那么您的问题有几个“中间立场”解决方案。
第一个解决方案您可以将其放入您的 global.asax 文件中(每个这个例子 http://geekswithblogs.net/michelotti/archive/2010/08/21/restful-wcf-services-with-no-svc-file-and-no-config.aspx)。您可以为每个服务制定一个服务路线:
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 入门套件 http://aspnet.codeplex.com/wikipage?title=WCF%20REST(即 WebServiceHost2Factory)。
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));
当使用您在上面尝试使用的 URI 时,这不会导致 307 重定向,因此可以准确满足您的需要。尽管我意识到使用该服务主机工厂而不是 WCF 4 附带的服务主机工厂感觉有点奇怪。