WCF Rest 4.0中的简单URL路由,可以不带结尾斜杠吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

我有一个基于WCF REST服务模板40(CS)的WCF REST 4.0项目。我想公开一些简单的服务端点URL,而不使用尾部斜线。例如:

  1. CarService.cs

  2. TruckService.cs

我将上述URL视为资源请求(而不是目录),这就是为什么我认为在这里不适合使用尾部斜杠的原因。

不幸的是,我似乎无法获得我想要的行为,因为我总是将其重定向到/ cars /和/ trucks / 并以斜杠结尾。

以下是我如何定义“汽车”路线和服务方法 - 请注意,我没有在任何路线或URI模板定义中包含任何斜杠:

// Global.asax.cs
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));

// CarService.cs
[WebGet(UriTemplate = "")]
public List<Car> GetCollection()
{
    return DataContext.GetAllCars();
}

请注意,MVC不以这种方式工作。使用MapRoute方法,我可以直接将请求路由到http://www.domain.com/about,而不必重定向到/ about /。我如何在WCF REST 4.0中获得相同的行为?

提问于
用户回答回答于

遇到的主要问题是当您的WebGet属性中的UriTemplate具有空字符串时,当前版本的WCF REST会导致307重定向(“/”)。据我所知,在当前版本中没有解决这个问题。

但是,考虑到需要一种解决方案,您可以针对您的问题提供几种“中间层”解决方案: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)));

这在使用上面尝试使用的URI时不会导致307重定向,因此可以准确地给出您需要的内容。虽然我意识到使用该服务主机工厂感觉有点奇怪,而不是WCF 4附带的服务主机工厂。

用户回答回答于

你需要一个UriTemplate,试试这样的东西:

 [ServiceContract()]
 public interface ICarService
 {

     [OperationContract]
     [WebGet(UriTemplate = "/Car")]
     CarPool GetAllCars();

     [OperationContract]
     [WebGet(UriTemplate = "/Car/{carName}")]
     Car GetCar(string carName);

 }

扫码关注云+社区