Wil*_*ill 19 rest wcf slash trailing
我有一个基于WCF REST服务模板40(CS)的WCF REST 4.0项目.我想暴露简单的服务端点URL 而不用尾部斜杠.例如:
我将上面的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中获得相同的行为?
您遇到的主要问题是,当您的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附带的工厂感觉有点奇怪.
| 归档时间: |
|
| 查看次数: |
13187 次 |
| 最近记录: |