WCF Rest 4.0中的简单URL路由,不带斜杠

Wil*_*ill 19 rest wcf slash trailing

我有一个基于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();
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*tti 9

您遇到的主要问题是,当您的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)));
Run Code Online (Sandbox Code Playgroud)

此时,您可以在每个服务中填充UriTemplate:

[WebGet(UriTemplate = "all")]
CarPool GetAllCars();

[WebGet(UriTemplate = "{carName}")]
Car GetCar(string carName);
Run Code Online (Sandbox Code Playgroud)

这将允许你的URI:

www.domain.com/cars/all
www.domain.com/cars/123 or www.domain.com/cars/honda
Run Code Online (Sandbox Code Playgroud)

同样适用于卡车:

www.domain.com/trucks/all
www.domain.com/trucks/123 or www.domain.com/trucks/ford
Run Code Online (Sandbox Code Playgroud)

第二种解决方案 使用REST Starter Kit中的服务主机(即WebServiceHost2Factory).

RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));
Run Code Online (Sandbox Code Playgroud)

当您使用上面尝试使用的URI时,这不会导致307重定向,从而为您提供所需的内容.虽然我意识到使用该服务主机工厂而不是WCF 4附带的工厂感觉有点奇怪.

  • 谢谢你的信息,史蒂夫.我已经考虑过使用你的"全部"建议(这是一个不错的解决方法),但我不愿意放弃我最初希望的规范REST语法.我正在研究所提供的WebServiceHostFactory和WebServiceHost2Factory之间的差异,以及后者阻止307重定向的内容.如果这是一个我可以理解的微小变化,我将采用这种方法. (2认同)